WPF:当绑定值为null时,在DataTrigger中设置Canvas颜色

Nic*_*olo 2 wpf binding

我正在将Canvas的Background属性绑定到某些SelectedColorItem对象,如下所示:

<Canvas>
    <Canvas.Style>
        <Style TargetType="Canvas">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedColorItem,Mode=OneWay,Converter={StaticResource isNullConverter}}"
                                             Value="True">
                     <Setter Property="Background" Value="Red" />
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </Canvas.Style>
    <Canvas.Background>
        <SolidColorBrush Color="{Binding SelectedColorItem.MediaColor}" />
    </Canvas.Background>
</Canvas>
Run Code Online (Sandbox Code Playgroud)

它有效 - 它显示所选的颜色.什么不起作用我写的DataTrigger表明SelectedColorItem为null.

最简单的isNullValueConverter也可以工作 - 它可以用Label变化:

<Label Content="{Binding Path=SelectedColorItem,Mode=OneWay,Converter={StaticResource isNullConverter}}" />
Run Code Online (Sandbox Code Playgroud)

它显示True,当SelectedColorItem为null时,否则为False.

有人能告诉我触发器有什么问题吗?

PS SelectedColorItem是ColorItemClass的一个实例,它包含一个MediaColor属性:

public System.Windows.Media.Color MediaColor {get;set;}
Run Code Online (Sandbox Code Playgroud)

Pav*_*kov 6

问题是,当样式中的值设置时,元素本身上设置的值具有更高的"优先级",这意味着在样式中设置的值(包括触发器)不能覆盖本地设置的值.

在设置之后,您需要在同一级别上同时具有两个值,因此只需Background在样式中移动属性绑定:

<Canvas>
    <Canvas.Style>
        <Style TargetType="Canvas">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="{Binding SelectedColorItem.MediaColor}" />
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedColorItem,Mode=OneWay,Converter={StaticResource isNullConverter}}"
                                             Value="True">
                     <Setter Property="Background" Value="Red" />
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </Canvas.Style>
</Canvas>
Run Code Online (Sandbox Code Playgroud)