2015-04-15 85 views
1

我有一個包含一堆這些驗證類的TreeView。最終,我希望將項目的背景顏色更改爲綠色,如果該類的成功屬性爲true,並且如果該屬性爲false,則將其更改爲紅色。C#WPF DataTemplate在屬性上設置背景顏色

public class Verify : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public string Name { get { return "Dummy Text"; } } 

    private bool success; 
    public bool Success 
    { 
     get { return success; } 
     set { success = value; NotifyPropertyChanged(); } 
    } 

    public Verify() 
    { 
     Success = true; /* Test that the background changes color */ 
    } 
} 

這裏就是我在我的TreeView至今得到。爲了測試我創建了一個ObservableCollection<Verify> VerifyWrite並添加了一些條目。這是我的TreeView被綁定到。我期望我的TreeView中的所有條目都是綠色的,因爲我已將「成功」設置爲true,但背景未設置爲任何值。

 <TreeViewItem Header="Verify Write" IsExpanded="True" ItemsSource="{Binding VerifyWrite}"> 
      <TreeViewItem.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}"/> 

        <DataTemplate.Triggers> 
         <DataTrigger Binding="{Binding Success}" Value="True"> 
          <Setter Property="TreeViewItem.Background" Value="Green"/> 
         </DataTrigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </TreeViewItem.ItemTemplate> 
     </TreeViewItem> 

我很新,很迷茫,在這個WPF的東西。

回答

1

模板內的觸發器僅適用於模板內的元素。爲此,您需要命名這些元素:

<DataTemplate> 
    <Grid x:Name="ItemBackground"> 
     <TextBlock Text="{Binding Name}"/> 
    </Grid> 

    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Success}" Value="True"> 
      <Setter TargetName="ItemBackground" Property="Background" Value="Green"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

但是,這種方法不會讓您對整個項目着色。爲此,您應該使用如下所示的ItemContainerStyle

<TreeViewItem Header="Verify Write" IsExpanded="True" ItemsSource="{Binding VerifyWrite}"> 
    <TreeViewItem.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Success}" Value="True"> 
        <Setter Property="Background" Value="Green"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TreeViewItem.ItemContainerStyle> 
</TreeViewItem>