如何选择带触发器的DataTemplate?

时间:2014-03-18 23:30:18

标签: c# wpf

我知道我可以写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}" />

1 个答案:

答案 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> 值时,模板将会更改。