根据ViewModel中存在的属性值在ItemContainerStyleSelector中设置样式

时间:2016-07-27 10:12:20

标签: wpf mvvm

我想知道您可以根据相应ViewModel中存在的Property值来决定自定义Style Selector类中的样式吗?

或者

有没有办法根据ViewModel中的Property选择ItemContainerstyle?

1 个答案:

答案 0 :(得分:8)

是的,ItemsControl为此提供ItemContainerStyleSelector。为Style选择ItemContainer可能有两种不同的方案。

在这个例子中,我们有

public class ViewModel
{ 
   public ObservableCollection<Student> Students { get; set; } 
   public bool IsGood { get; set; }
}
  1. 基于主ViewModel进行选择(这与ItemsSource不同)。请使用Trigger

       <ItemsControl.Style>
            <Style TargetType="ItemsControl">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsGood}" Value="True">
                        <Setter Property="ItemContainerStyle" Value="{DynamicResource Style1Key}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
       </ItemsControl.Style>
    
  2. 根据Student的属性(例如,名称)进行选择。我们必须在这里使用ItemsControl.ItemContainerStyleSelector

      public class MyStyleSelector : StyleSelector
        {
            public Style Style1 { get; set; }
            public Style Style2 { get; set; }
    
            public override Style SelectStyle(object item, DependencyObject container)
            {
                Student s = (Student)item;
                if(s.Name == "Gopi")
                    return Style1;
                else
                    return Style2;
            }
        }
    

    XAML

    <Window.Resources>
        <Style x:Key="Style1Key">
            <Setter Property="Control.Opacity" Value="0.3"/>
        </Style>
        <Style x:Key="Style2Key">
            <Setter Property="Control.Opacity" Value="0.7"/>
        </Style>
    </Window.Resources> 
    <ItemsControl ItemsSource="{Binding Students}">
    ...
      <ItemsControl.ItemContainerStyleSelector>
         <local:MyStyleSelector Style1="{StaticResource Style1Key}" Style2="{StaticResource Style2Key}"/>
      </ItemsControl.ItemContainerStyleSelector>  
    ...
    </ItemsControl>