32

我有一个非常简单的 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。

4

3 回答 3

39

来自 MSDN:

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

这意味着以下情况之一:

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

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

删除内部Binding中的Converter,应该是固定的!:)

希望这可以帮助!

于 2010-05-11T14:19:59.847 回答
4

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

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

        ...

    }

确保没有任何值未设置(通常与DataGridwith 一起发生CanUserAddRows="True")。

于 2020-08-07T14:31:38.843 回答
0

如果发生在数据网格中,请尝试设置 CanUserAddRows="False"

于 2020-05-28T23:54:27.807 回答