2012-11-21 188 views
2

是的,datatrigger在一个样式中。现在,这个问题在我们后面,我很想知道为什么下面的代码不起作用。 我应该看到数据网格的蓝色背景,但样式被忽略。我究竟做错了什么?注意我已经命名Window元素“root”。这个DataTrigger为什么不起作用?

<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" }; 
    } 
} 

回答

1

您有几个问题。首先,您需要实现INotifyPropertyChanged接口并在SomeCondition setter属性上引发PropertyChanged事件,或使SomeCondition成为DependencyProperty。如果没有这样做,你的用户界面永远不会知道属性值已经改变。

第二个是我相信,如果数据触发器的值与默认值相同,则不会发生数据触发器。所以,假触发不会发生,因为布尔默认值为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,并在属性为真时进行更改。

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

+0

感谢您的回答。是的你是正确的我需要实现INotifyPropertyChanged和我的应用程序。但我的问题是“为什么风格被忽略?”不是“为什么条件改变时颜色不变”。正如你指出的,默认值是蓝色的,当属性为真时会改变。但是,这不是我所看到的。我看到灰色,表明风格有问题。此外,网格能够绑定到列表。目前,我不想更新数据更改的时间。 – Sam

+0

问题 - 和往常一样 - 是我。我有一个typeo SomeCondtion是错误的。 mdm20感谢你至少给我一个正确的方向。如果魔术字拼写正确,我发布的代码将会有效。 – Sam

+0

我没有注意到这个错字:) – mdm20

2

XAML布尔值是区分大小写的,但是,我相信你需要在Value属性使用时用“假”与“真”。

+0

谢谢你,先生。但那个答案不正确:)。 – Sam