0

我有ListView哪个ItemSourcebindend to ObservableCollection<Period>wherePeriod

 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按这个顺序设置每个的背景:添加-绿色/删除-红色/编辑-黄色/无默认。在这里找到了很多解决方案,但没有提供我的解决方案。如果存在问题,请发表评论,我将关闭此

[编辑] 我想以DataTemplate这种方式使用:创建模板,该模板创建与Background属性的绑定并 StatusPeriod其中使用转换器。但不知道如何保留其余的设计

4

3 回答 3

1

请使用DataTriggers 作为 of 中的属性Background(本问题中的示例:您不需要转换器,使用枚举值而不是整数值)。StyleListViewItem

<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>
于 2012-08-06T07:57:38.413 回答
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>

这是一个示例代码:您可能需要添加一个命名空间以enumXAML.

于 2012-08-06T07:59:25.660 回答
0

我发现拥有一个专用的 PeriodStatusColor 只读属性更容易,更少的“纯 xaml”,是的,但是更少的代码,并且所有代码都在同一个地方。所以这个属性只返回当前 PeriodStatus 的颜色。在 PeriodStatus 更改时,还引发 PeriodStatusColor PropertyChanged。使用静态冻结颜色,并且可能使用 PeriodStatus --> Color static Dictionnary 来获得干净的代码。

于 2012-08-06T09:57:02.683 回答