【问题标题】:DataTrigger not working in WPF ListBoxDataTrigger 在 WPF ListBox 中不起作用
【发布时间】:2017-03-10 15:53:57
【问题描述】:

我有以下 WPF ListView,根据我的类 MyItemsClass 中的属性 ChangeView 更改模板。

<ListView x:Name="MyListView" ItemsSource="{Binding}">
    <ListView.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="True">
                    <Setter Property="ListView.ItemsPanel" Value="{StaticResource largeTemplate}"/>
                </DataTrigger>

                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="False">
                    <Setter Property="ListView.ItemsPanel" Value="{StaticResource smallTemplate }" />
                </DataTrigger>
            </Style.Triggers>
         </Style>
     </ListView.Style>

<ItemsPanelTemplate x:Key="largeTemplate">
    <WrapPanel Orientation="Horizontal" IsItemsHost="True">
        <WrapPanel.Resources>
            <BooleanToVisibilityConverter x:Key="BoolToVisibility"/>
            <HierarchicalDataTemplate DataType="{x:Type local:MyData}">
                <Button Command="{Binding}" Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}">
                        <Image Height="100" Width="100"  Source="{Binding Path=MyImage}"/>
                </Button>
            </HierarchicalDataTemplate>
        </WrapPanel.Resources>
    </WrapPanel>
</ItemsPanelTemplate>

smallTemplate 与 largeTemplate XAML 相同,只是 iamge 的大小不同。

现在我想用现有的 ListView 样式“剥皮”我的 ListView,所以如果我执行以下操作,它会起作用

<ListView x:Name="MyListView" ItemsSource="{Binding}" ItemContainerStyle="{DynamicResource MyStyle}">

</ListView>

<Style x:Key="MyStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource ListViewItemStyle}">
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter> 
</Style>

所以现在我尝试像这样添加原始触发器:

<ListView x:Name="MyListView" ItemsSource="{Binding}" ItemContainerStyle="{DynamicResource MyStyle}">

</ListView>

<Style x:Key="MyStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource ListViewItemStyle}">
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter> 

    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="True">
            <Setter Property="ListView.ItemsPanel" Value="{StaticResource largeTemplate}"/>
        </DataTrigger>

        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="False">
            <Setter Property="ListView.ItemsPanel" Value="{StaticResource smallTemplate }" />
        </DataTrigger>
    </Style.Triggers>
</Style>

但是现在我的 DataTriggers 不起作用 - 当我的类变量更改时 ListView.ItemsPanel 不会更改。我怎样才能让它工作?

【问题讨论】:

  • 这些不应合并为一种样式。触发器是 ListBox 本身样式的一部分,而样式的其余部分用于单个项目。
  • 好的,那我如何在 ListView 中添加两种样式呢??

标签: c# wpf xaml


【解决方案1】:

试试这个:

<ListView x:Name="MyListView" ItemsSource="{Binding}" Style="{DynamicResource MyStyle}">

</ListView>

<Style x:Key="MyStyle" TargetType="{x:Type ListView}" BasedOn="{StaticResource ListViewStyle}">
   <Setter Property="ItemTemplate">
        <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter> 

    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="True">
            <Setter Property="ListView.ItemsPanel" Value="{StaticResource largeTemplate}"/>
        </DataTrigger>

        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="False">
            <Setter Property="ListView.ItemsPanel" Value="{StaticResource smallTemplate }" />
        </DataTrigger>
    </Style.Triggers>
</Style>

我将您的样式更改为以 ListView 本身的样式而不是其 ItemContainerStyle 属性为目标,然后我将 &lt;Setter Property="Template"&gt; 更改为 &lt;Setter Property="ItemTemplate"&gt; 以便它只会覆盖您的项目的模板,而不是覆盖模板对于整个ListView

【讨论】:

  • 恐怕还是一样 - 更改“ChangeView”不会触发 ListView.ItemsPanel 更改。
【解决方案2】:

所以你有一个有效的ListView 风格?为什么不简单地将它的ItemContainerStyle 属性设置为您的“MyStyle”?:

<ListView x:Name="MyListView" ItemsSource="{Binding}" ItemContainerStyle="{DynamicResource MyStyle}">
    <ListView.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="True">
                    <Setter Property="ListView.ItemsPanel" Value="{StaticResource largeTemplate}"/>
                </DataTrigger>

                <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type myClass:MyItemsClass}}, Path=ChangeView}" Value="False">
                    <Setter Property="ListView.ItemsPanel" Value="{StaticResource smallTemplate }" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Style>
</ListView>

MyStyle 适用于 ListViewItem 而不是 ListView,所以这应该可以工作。

或者您要申请的“皮肤”是什么?

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2021-11-14
    • 2015-04-30
    • 2013-09-24
    • 2014-09-09
    • 2012-07-11
    • 1970-01-01
    • 2016-08-20
    • 2013-02-24
    相关资源
    最近更新 更多