如何根据一个属性设置不同的背景?

时间:2012-08-06 07:41:23

标签: c# wpf listview listviewitem

我有ListView ItemSource bindend到ObservableCollection<Period> Period

 public class Period : INotifyPropertyChanged
 {
    //some stuff
    //

    public Status PeriodStatus
    {
        get;
        set;
    }

    #region PropertyChangedEventHandler members

    public void SendPropertyChanged(string name)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion 
}

public enum Status
{
    None,
    Added,
    Deleted,
    Edited
}

我希望按此顺序设置每个ListViewItem的背景:added-green / deleted-red / edited-yellow / none-default。在这里找到了很多解决方案,但没有提供我的解决方案。如果存在问题,请发表评论,我将关闭此

[编辑] 我希望以这种方式使用DataTemplate:创建使用Background属性创建绑定的模板和使用转换器的Status创建Period。但不知道如何保持其余的设计

3 个答案:

答案 0 :(得分:1)

DataTrigger Background Style ListViewItem使用<ListView> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Added"> <Setter Property="Background" Value="Green" /> </DataTrigger> <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Deleted"> <Setter Property="Background" Value="Red" /> </DataTrigger> <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Edited"> <Setter Property="Background" Value="Yellow" /> </DataTrigger> <Style.Triggers> </Style> </ListView.ItemContainerStyle> </ListView> 属性{{1}}:您不需要转换器,请使用枚举值而不是整数值。)

{{1}}

答案 1 :(得分:1)

最简单的方法是在Triggers中使用ListView.ItemContainerStyle

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Added">
                <Setter Property="Background" Value="Green" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Deleted">
                <Setter Property="Background" Value="Red" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=PeriodStatus}" Value="Edited">
                <Setter Property="Background" Value="Yellow" />
            </DataTrigger>
        <Style.Triggers>
    <Style>
<ListView.ItemContainerStyle>

这是一个示例代码:您可能需要在enum添加名称空间,以便在XAML中使用它。

答案 2 :(得分:0)

我发现拥有专用的PeriodStatusColor只读属性更容易,更少'纯xaml',是的,但代码更少,所有代码都在同一个地方。所以这个属性只返回当前PeriodStatus的颜色。在PeriodStatus更改时,还要引发PeriodStatusColor PropertyChanged。使用静态冷冻颜色,也可以使用PeriodStatus - &gt; Color static Dictionnary有干净的代码。