是的,数据触发器位于样式中。既然这个问题已经过去了,我很想知道为什么以下代码无效。 我应该看到数据网格的蓝色背景,但样式被忽略。我究竟做错了什么?注意我已将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" };
}
}
答案 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。