如何根据一个属性设置不同的背景?
我有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
:创建其创建与Period
Background
财产和Status
它使用转换器绑定模板。但不知道如何保持设计的其余部分
请使用DataTrigger
S为Background
财产的ListViewItem
的Style
(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>
最简单的一种是在你的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类)定义。 – 2012-08-06 08:02:21
是的,你是对的。我修复了我的答案。 – STiLeTT 2012-08-06 08:06:14
我发现更容易拥有一个专用的PeriodStatusColor只读属性,更少的'纯xaml',是的,但代码少,所有代码在同一个地方。所以这个属性只是返回当前PeriodStatus的颜色。在PeriodStatus更改时,还会引发一个PeriodStatusColor PropertyChanged。使用静态冻结的颜色,也可以使用PeriodStatus - > Color static Dictionnary来获得干净的代码。
你可以使用'Converter' /'Style'&'Trigger' /'DataTemplate' ....你已经试过了什么? – 2012-08-06 07:53:45