【问题标题】:How to set different background according to one property?如何根据一个属性设置不同的背景?
【发布时间】:2012-08-06 07:41:22
【问题描述】:

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

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

【问题讨论】:

  • 你可以使用Converter / Style & Trigger / DataTemplate....你已经尝试了什么?

标签: c# wpf listview listviewitem


【解决方案1】:

对于StyleListViewItem 中的Background 属性,请使用DataTriggers(example in this question:您不需要转换器,使用枚举值而不是整数值)。

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

【讨论】:

    【解决方案2】:

    最简单的一种是在您的ListView.ItemContainerStyle 中使用Triggers

    <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 中使用它。

    【讨论】:

    • 我认为这行不通。必须为ListViewItem(不是ListView 类)定义样式。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2019-12-22
      • 2022-11-22
      • 2012-09-06
      相关资源
      最近更新 更多