2012-08-06 138 views
0

我有ListViewItemSource 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:创建其创建与PeriodBackground财产和Status它使用转换器绑定模板。但不知道如何保持设计的其余部分

+0

你可以使用'Converter' /'Style'&'Trigger' /'DataTemplate' ....你已经试过了什么? – 2012-08-06 07:53:45

回答

1

请使用DataTrigger S为Background财产的ListViewItemStyleexample 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> 
1

最简单的一种是在你的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> 

这是一个示例代码:您可能需要添加一个命名空间与您的enumXAML使用它。

+1

我认为这是行不通的。风格必须为ListViewItem(而不是ListView类)定义。 – 2012-08-06 08:02:21

+0

是的,你是对的。我修复了我的答案。 – STiLeTT 2012-08-06 08:06:14

0

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

相关问题