为什么在MultiBinding中转换值时会得到DependencyProperty.UnsetValue?

Eri*_*ber 28 c# wpf xaml dependency-properties ivalueconverter

我有一个非常简单的IMultiValueConverter,它只是OR的两个值.在下面的示例中,我想使用同样简单的布尔型逆变器反转第一个值.

<MultiBinding Converter="{StaticResource multiBoolToVis}">
    <Binding Path="ConditionA" Converter="{StaticResource boolInverter}"/>
    <Binding Path="ConditionB"/>
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)

和逆变器:

public class BoolInverterConverter : IValueConverter
{
    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            return !((bool)value);
        }
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

当我包含boolInverter时,MultiValueConverter中的第一个值变为"DependencyProperty.UnsetValue".当我不使用转换器时没有问题(当然,除了我不是针对的逻辑).

我错过了什么吗?单步执行调试器会显示InverseBoolConverter正在反转我传递的值,但该值不会被"发送"到MultiValueConverter.

Arc*_*rus 32

来自MSDN:

UnsetValue是一个标记值,用于WPF属性系统无法确定请求的DependencyProperty值的场景.使用UnsetValue而不是null引用(在Visual Basic中为Nothing),因为null引用可以是有效的属性值,也可以是有效(且经常使用)的DefaultValue.

这意味着以下之一:

  • 您使用模板(ControlTemplateDataTemplate),并且该值在加载时没有设置DataSource.所以它会两次击中你的转换器,首先是UnsetValue,第二个是布尔值; 所以没什么好担心的;
  • Binding的不正确,这意味着Binding无法确定一个值,从而导致UnsetValue ..你应该看到一个警告..

此外,你不能像你一样组合转换器.所以它可能是这样.

删除内部绑定中的转换器,它应该是固定的!:)

希望这可以帮助!

  • 找到我的答案:) ..通过使用'是'我可以检查. (3认同)

sim*_*mon 5

除了所有其他答案之外,我通常将这些行添加到Convert方法的开头:

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Any(x => x == DependencyProperty.UnsetValue))
            return DependencyProperty.UnsetValue;

        ...

    }
Run Code Online (Sandbox Code Playgroud)

确保没有任何值被取消设置(这通常发生在DataGridwith中CanUserAddRows="True")。