c# - 如何选择带触发器的DataTemplate?

标签 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}" />

最佳答案

是的,可以。

只需指向 Setter.ValueStaticResource包含 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/

相关文章:

c# - 为 Postgresql 安装 Npgsql.dll

c# - 关闭浏览器时运行sql查询

c# - 使用方法属性消除冗余代码

c# - 扩展 Wpf MouseButtonEventArgs 以启用自定义参数

c# - 在单个表单中使用带有多个控件的 MVVM

wpf - ViewModel 应该如何与 Repository 交互?

c# - 如何修复 DeleteManyAsync 返回使用过滤器删除的 0 条记录?

c# - 我是否应该始终在 ASP.NET Core API Controller 中使用 async/await

c# - 在 WPF 应用程序中将数据从 C# 发送到 Javascript

c# - 有没有比 Grid 或 WrapPanel 更好的方法来在表单上布置标签/值对?