我知道我可以编写 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}" />
最佳答案
是的,可以。
只需指向 Setter.Value
到 StaticResource
包含 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>
当 IsAllowed
时,模板将被更改值已更改。
关于c# - 如何选择带触发器的DataTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22493262/