我有一个包含许多这些验证类的TreeView。最后,如果类的Success属性为true,我想将项目的背景颜色更改为Green;如果属性为false,则将其更改为Red。
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中。
答案 0 :(得分:2)
模板内的触发器仅适用于模板内的元素。为此你需要命名这些元素:
<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>