2012-11-21 229 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