2

是的,数据触发器在样式中。现在这个问题已经过去了,我很想知道为什么下面的代码不起作用。我应该看到数据网格的蓝色背景,但样式被忽略。我究竟做错了什么?注意我已将 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" };
    }
}
4

2 回答 2

2

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

于 2012-11-21T01:09:21.523 回答
1

你有几个问题。第一个是您需要实现 INotifyPropertyChanged 接口并在 SomeCondition 设置器属性上引发 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 时更改。

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

于 2012-11-21T04:37:24.490 回答