【问题标题】:Dynamically changing WPF ListView ItemsPanel & ItemsContainerStyle动态改变 WPF ListView ItemsPanel & ItemsContainerStyle
【发布时间】:2014-02-18 17:46:05
【问题描述】:

我在 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 触发器显示不同的视图。

【问题讨论】:

    标签: wpf listview controltemplate itemspaneltemplate


    【解决方案1】:

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

    Microsoft 已经提供了在线示例,您可以从 here 下载。

    或

    也许您可以在资源中定义两个单独的 ListView 作为两个单独的 DataTemplate。

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

    【讨论】:

    • 两者似乎都是完美的解决方案......但如果我必须做出选择,我应该选择哪一个......根据你的说法,哪个解决方案会更好地实施......从性能的观点。
    • 如果您有两个以上的模板,我建议您使用第一种方法,否则第二种方法就可以满足您的需求。性能影响对我来说似乎相同,因为在运行时您正在更改模板。在第一种情况下,您正在更改 ListView 模板,在第二种情况下,您正在更改 ContentControl 模板。
    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 2011-10-23
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多