为什么这个DataTrigger不起作用?

时间:2012-11-21 00:48:28

标签: c# .net wpf

是的,数据触发器位于样式中。既然这个问题已经过去了,我很想知道为什么以下代码无效。 我应该看到数据网格的蓝色背景,但样式被忽略。我究竟做错了什么?注意我已将Window元素命名为“root”。

<Window x:Class="DataGridTriggerTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" x:Name="root">
<Grid>
    <DataGrid ItemsSource="{Binding SomeData}" >
        <DataGrid.Style>
            <Style TargetType="DataGrid">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=root, Path=SomeCondition}" Value="true">
                        <Setter Property="Background" Value="Red"></Setter>
                        <Setter Property="RowBackground" Value="Red"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=root, Path=SomeCondtion}" Value="false">
                        <Setter Property="Background" Value="Blue"></Setter>
                        <Setter Property="RowBackground" Value="Blue"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Style>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding}" Header="Data"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>

以下是代码:

public partial class MainWindow : Window
{
    public bool SomeCondition { get; set; }
    public List<string> SomeData { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        SomeData = new List<string> { "hello", "world" };
    }
}

2 个答案:

答案 0 :(得分:2)

XAML布尔值是不区分大小写的,但是,我认为在Value属性中使用它时需要使用“False”和“True”。

答案 1 :(得分:1)

你有一些问题。第一个是你需要实现INotifyPropertyChanged接口并在SomeCondition setter属性上引发PropertyChanged事件,或者使SomeCondition成为DependencyProperty。如果不这样做,您的UI将永远不会知道属性值已更改。

第二个是我相信如果值与默认值相同,则不会发生数据触发器。因此,假触发将永远不会发生,因为布尔默认值为false。我认为您可以设置默认样式值以匹配属性的默认值。在这种情况下为false ...就像这样:

        <Style TargetType="DataGrid">
            <Setter Property="Background" Value="Blue" />
            <Setter Property="RowBackground" Value="Blue" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=root, Path=SomeCondition}" Value="true">
                    <Setter Property="Background" Value="Red"></Setter>
                    <Setter Property="RowBackground" Value="Red"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

属性为false时默认为蓝色,属性为true时默认值为。

最后,您应该使用ObservableCollection而不是List for SomeData。