2017-03-10 9 views
1

プロパティに応じてテンプレートを変更する次のWPF ListViewがあります。ChangeView in My class MyItemsClassDataTriggerがWPF ListBoxで動作しない

<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のみiamgeの異なるサイズを有するlargeTemplate XAMLと同じです。

今、私はそれがだから今、私はそうのようなオリジナルのトリガーに追加しようとしています

<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コントロールの既存のスタイルを持つ「肌」私の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.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は変更されません。どのようにこれを動作させることができますか?私はむしろそのItemContainerStyleプロパティよりもリストビュー自体のスタイルをターゲットに自分のスタイルを変え

<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> 

、その後、私はそれが唯一のテンプレートを上書きするように<Setter Property="ItemTemplate"><Setter Property="Template">を変更:

+0

これらを1つのスタイルに組み合わせることはできません。トリガーは、ListBox自体のスタイルの一部ですが、残りのスタイルは個々のアイテムのスタイルです。 –

+0

ok、ListViewに2つのスタイルを追加するにはどうすればいいですか? –

答えて

0

代わりにこれを試してみてくださいテンプレート全体をListViewのように上書きするのではなく、

+0

まだ同じですが、ChangeViewを変更してもListView.ItemsPanelが変更されるわけではありません。 –

0

したがって、ListViewのスタイルがありますか?なぜあなたは単に

<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はそう、これは動作するはずListViewListViewItemとしないように適用される?:あなたの「MyStyleは」へのItemContainerStyleプロパティを設定しないでください。

または、あなたが適用しようとしている「スキン」は何ですか?

関連する問題