我知道我可以写ItemTemplateSelector
来做这件事,但我想知道如何用触发器来做。我尝试了以下,但没有成功。这可能是因为首先没有设置ItemTemplate
因此没有关于可以应用哪些触发器的数据。是否可以使用触发器进行操作?
<UserControl.Resources>
<Style TargetType="{x:Type ItemsControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsAllowed}" Value="True">
<Setter Property="ItemTemplate" >
<Setter.Value>
<DataTemplate>
...
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsAllowed}" Value="False">
<Setter Property="ItemTemplate" >
<Setter.Value>
<DataTemplate>
...
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ItemsControl ItemsSource="{Binding MyData}" />
答案 0 :(得分:2)
是的,你可以。
只需将Setter.Value
指向包含StaticResource
的{{1}},就像这样:
DataTemplate
然后在资源中声明两个模板(<Style
TargetType='{x:Type ItemsControl}'>
<Style.Triggers>
<DataTrigger
Binding='{Binding Path=IsAllowed}'
Value='True'>
<Setter
Property='Background'
Value='LightGreen' />
<Setter
Property='ItemTemplate'
Value='{StaticResource TrueTemplate}' />
</DataTrigger>
<DataTrigger
Binding='{Binding Path=IsAllowed}'
Value='False'>
<Setter
Property='Background'
Value='LightCoral' />
<Setter
Property='ItemTemplate'
Value='{StaticResource FalseTemplate}' />
</DataTrigger>
</Style.Triggers>
</Style>
)。 <UserControl.Resources>
:
TrueTemplate
<DataTemplate
x:Key='TrueTemplate'>
<StackPanel
Orientation='Horizontal'>
<TextBlock
Text='{Binding Path=Name}' />
<TextBlock
Text=' ' />
<TextBlock
Text='{Binding Path=Surname}' />
<TextBlock
Text=', ' />
<TextBlock
Text='{Binding Path=Age}' />
</StackPanel>
</DataTemplate>
:
FalseTemplate
更改<DataTemplate
x:Key='FalseTemplate'>
<StackPanel
Orientation='Horizontal'>
<TextBlock
Text='{Binding Path=Age}' />
<TextBlock
Text=': ' />
<TextBlock
Text='{Binding Path=Name}' />
<TextBlock
Text=' ' />
<TextBlock
Text='{Binding Path=Surname}' />
</StackPanel>
</DataTemplate>
值时,模板将会更改。