C#WPF DataTemplate在属性上设置背景颜色

时间:2015-04-15 23:15:16

标签: c# wpf

我有一个包含许多这些验证类的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中。

1 个答案:

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