当属性路径为 null 时,WPF 绑定转换器不会运行



我有这个类:

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

。和这个视图模型:

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}}"
/>

。和这个值转换器:

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有何不同?这个问题有什么解决方法吗?

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

绑定转换器应将绑定的源属性的值转换为可分配给目标属性的值。

如果无法计算源属性的值,则无法调用转换器。

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

或者,根本不使用转换器,而是使用带有数据触发器的样式和 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>

最新更新