我有一个非常简单的IMultiValueConverter,它只是OR的两个值。在下面的示例中,我想使用同样简单的布尔型逆变器反转第一个值。
<MultiBinding Converter="{StaticResource multiBoolToVis}">
<Binding Path="ConditionA" Converter="{StaticResource boolInverter}"/>
<Binding Path="ConditionB"/>
</MultiBinding>
和逆变器:
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
}
当我包含boolInverter时,MultiValueConverter中的第一个值变为“DependencyProperty.UnsetValue”。当我不使用转换器时没有问题(当然,除了不是我的目标逻辑之外)。
我错过了什么吗?单步执行调试器会显示InverseBoolConverter正在反转我传递的值,但该值不会被“发送”到MultiValueConverter。
答案 0 :(得分:31)
来自MSDN:
UnsetValue是一个标记值,用于WPF属性系统无法确定请求的DependencyProperty值的场景。使用UnsetValue而不是null引用(在Visual Basic中为Nothing),因为null引用可以是有效的属性值,也可以是有效的(经常使用的)DefaultValue。
这意味着以下之一:
ControlTemplate
或DataTemplate
),并且该值在加载时没有设置DataSource。所以它会两次击中你的转换器,首先是UnsetValue,第二个是布尔值;所以没什么可担心的; Binding
不正确,这意味着Binding无法确定值,从而导致UnsetValue ..您应该可能会看到警告.. 另外,你不能像你那样组合转换器。所以可能就是这样。
删除内部绑定中的转换器,它应该被修复! :)
希望这有帮助!
答案 1 :(得分:2)
除了所有其他答案外,我通常将这些行添加到Convert
方法的开头:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Any(x => x == DependencyProperty.UnsetValue))
return DependencyProperty.UnsetValue;
...
}
确保没有设置任何值(通常在DataGrid
和CanUserAddRows="True"
中发生)。
答案 2 :(得分:0)
如果发生在数据网格中,请尝试设置CanUserAddRows =“ False”