【问题标题】:WPF Binding Converter does not run when Property Path is null当属性路径为空时,WPF 绑定转换器不运行
【发布时间】:2019-12-12 21:21:04
【问题描述】:

我有这门课:

public class MyClass
{
    public bool? Accepted { get; set; } = true;
}

...还有这个 ViewModel:

public class MyViewModel
{
    public MyClass MyClass => null;
}

...和这个视图:

<MyControl.Resources>
    <mynamespace:RedColorWhenNullConverter x:Key="RedColorWhenNullConverter" />
</MyControl.Resources>
<Rectangle
    Height="100"
    Width="100"
    Fill="{Binding MyClass.Accepted, Converter={StaticResource RedColorWhenNullConverter}}"
/>

...还有这个ValueConverter:

public class RedColorWhenNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Green);
    }

    {...}
}

当视图模型为 MyClass 属性返回 null 时,转换器根本不会运行。我期待它以 null 的值运行。

如果视图的DataContextMyClass 并且绑定直接到Accepted 属性,如下所示:{Binding Accpected, ...,并且Accepted 属性返回null 转换器运行。

这与绑定链MyClass.Accepted 有何不同?是否有任何解决此问题的方法?

C# 中是否存在用于 xaml 的空条件运算符?这样做会很好{Binding MyClass?.Accepted, ...

【问题讨论】:

  • 在这种情况下 Fill="{Binding MyClass.Accepted, Converter={StaticResource RedColorWhenNullConverter}}" 它会抛出 NRE,使用 FallbackValueTargetNullValue 是有意义的

标签: c# wpf xaml binding converters


【解决方案1】:

Binding Converter 应该将 Binding 的源属性的值转换为可分配给目标属性的值。

如果无法评估源属性的值,则无法调用 Converter。

您可以将FallbackValue=Red 添加到绑定中,但仍不会调用转换器。

或者根本不使用转换器,而是使用带有 DataTriggers 的样式和 Fill 属性的默认值:

<Rectangle Height="100" Width="100">
    <Rectangle.Style>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="Red"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding MyClass.Accepted}" Value="False">
                    <Setter Property="Fill" Value="Blue"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding MyClass.Accepted}" Value="True">
                    <Setter Property="Fill" Value="Green"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

【讨论】:

  • 对不起,但我的真正问题与示例完全不同。我需要运行转换器,即使 MyClassnull 才能解决我的真正问题。
  • "如果源属性的值不能被求值,转换器就不能被调用"——你不能转换不存在的东西。
  • 您可以写Fill="{Binding MyClass, ...}" 并让转换器转换MyClass 值而不是bool?
  • 您可以使用Value="{x:Null}" 以及true 和false。但这只是通过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2011-04-04
  • 2010-11-01
  • 2012-07-20
  • 2013-01-08
相关资源
最近更新 更多