簡體   English   中英

DataTrigger無法在WPF ListBox中工作

[英]DataTrigger not working in WPF ListBox

我有以下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不會改變。 我怎么能讓這個工作?

試試這個:

<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屬性,然后我將<Setter Property="Template">更改為<Setter Property="ItemTemplate">這樣它只會覆蓋你的模板項目,而不是覆蓋整個ListView的模板。

那么你有一個有效的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所以這應該工作。

或者你試圖應用的“皮膚”是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM