2017-03-10 1 views
1

ich folgende WPF Listview, wo ich die Vorlage ändern auf dem Grundstück je Change in meiner Klasse MyItemsClass.Datatrigger funktioniert nicht in 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 ist die gleiche wie largeTemplate XAML nur mit verschiedenen Größen von iamge.

Jetzt möchte ich ‚Haut‘ meine Listview mit einem bestehenden Stil Listview so, wenn ich die folgenden es

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

So funktioniert jetzt ich in den ursprünglichen Auslöser wie so hinzuzufügen bin versucht:

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

Aber jetzt funktionieren meine DataTriggers nicht - das ListView.ItemsPanel ändert sich nicht, wenn meine Klassenvariable geändert wird. Wie kann ich das zur Arbeit bringen?

+0

Diese sollten nicht in einem Stil kombiniert werden. Die Auslöser sind Teil des Stils für die ListBox selbst, während der Rest des Stils für die einzelnen Elemente gilt. –

+0

ok, wie füge ich dann zwei Stile zu einem ListView hinzu ?? –

Antwort

0

Versuchen Sie stattdessen:

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

ich Ihren Stil zum Ziel, die Art des Listview selbst verändert, anstatt seine ItemContainerStyle Eigenschaft, und dann änderte ich <Setter Property="Template">-<Setter Property="ItemTemplate"> so, dass es nur die Vorlage außer Kraft für Ihre Artikel, sondern überschreiben Sie die Vorlage für das ganze ListView.

+0

Immer noch die gleiche Angst - Änderung 'ChangeView' löst nicht das ListView.ItemsPanel zu ändern. –

0

Sie haben also einen funktionierenden ListView Stil? Warum gehst du nicht einfach setzen Sie die ItemContainerStyle Eigenschaft es zu einem „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 gilt für eine ListViewItem und nicht auf eine ListView so sollte diese Arbeit.

Oder was ist die "Haut", die Sie anwenden möchten?