我想知道您可以根据相应ViewModel中存在的Property值来决定自定义Style Selector类中的样式吗?
或者
有没有办法根据ViewModel中的Property选择ItemContainerstyle?
答案 0 :(得分:8)
是的,ItemsControl
为此提供ItemContainerStyleSelector
。为Style
选择ItemContainer
可能有两种不同的方案。
在这个例子中,我们有
public class ViewModel
{
public ObservableCollection<Student> Students { get; set; }
public bool IsGood { get; set; }
}
基于主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>
根据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>