动态更改WPF ListView ItemsPanel& ItemsContainerStyle

时间:2014-02-18 17:46:05

标签: wpf listview controltemplate itemspaneltemplate

我在XAML中有一个ListView,它以GridView(带列)方式显示其源集合。 但是我打算使用相同的ListView来显示源集合可能在图像网格中,或者某些卡片视图中。 我希望ListView根据ComboBox选择进行更改。所以说对于ComboBox值1,ListView应该显示一个GridView,对于值为2的ListView应该显示卡片视图。 目前我的ListView将GridView集指定为其View属性:

<ListView ItemsSource="{Binding PersonList}" Width="450" HorizontalAlignment="Right" IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" />
                <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" />
                <GridViewColumn Header="Ip Address" DisplayMemberBinding="{Binding Path=IpAddress}" />
            </GridView>
        </ListView.View>
    </ListView>

我想知道如何更改ListView以根据ComboBox触发器显示不同的视图。

1 个答案:

答案 0 :(得分:1)

ListView View是类型为ViewBase的DependencyProperty。因此,您可以做的是创建自己的自定义视图,并可以通过组合框选定项目上的DataTrigger进行设置

Microsoft已在线提供样本,您可以从here下载。

可能你可以在资源中定义两个独立的ListView 作为两个单独的DataTemplates。

<Window.Resources>
   <DataTemplate x:Key="GridViewTemplate">
      <ListView/> <!-- GridView -->
   </DataTemplate>
   <DataTemplate x:Key="CardViewTemplate">
      <ListView/> <!-- CardView -->
   </DataTemplate>
</Window.Resources>

并且有一个ContentControl,您可以根据组合框中的选定值交换其内容。

<ContentControl>
   <ContentControl.Style>
      <Style TargetType="ContentControl">
         <Setter Property="Content"
                 Value="{StaticResource GridViewTemplate}"/>
            <Style.Triggers>
               <DataTrigger Binding="{Binding SelectedValue}" Value="Value2">
                  <Setter Property="Content"
                          Value="{StaticResource CardViewTemplate}"/>
               </DataTrigger>
            </Style.Triggers>
       </Style>
    </ContentControl.Style>
</ContentControl>