2015-04-15 3 views
1

У меня есть TreeView, содержащий кучу этих классов проверки. В конечном счете, я хотел бы изменить цвет фона элемента на «Зеленый», если свойство «Свойство класса» является истинным и красным, если свойство является ложным.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 станут зелеными, потому что я установил для Success значение 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> 
Смежные вопросы