我有这个类:
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
运行。
如果视图的DataContext
是MyClass
的,并且绑定直接绑定到 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>