C# WPF DataTemplate如何根据属性设置背景颜色

3

我有一个TreeView,其中包含许多这些Verify类。最终,如果该类的Success属性为true,则我想将项目的背景颜色更改为绿色;如果该属性为false,则将其更改为红色。

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个回答

3

模板内的触发器仅适用于模板内的元素。因此,您需要对这些元素进行命名:

<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接