【问题标题】:What is The difference between ListBox and ListViewListBox 和 ListView 有什么区别
【发布时间】:2011-06-09 20:56:17
【问题描述】:

WPF的ListBox和ListView有什么区别?我找不到它们的属性有任何显着差异。有不同的典型用途吗?

【问题讨论】:

  • 答案中未提及:ListView 有列标题,ListBox 没有

标签: .net wpf wpf-controls wpf-listview


【解决方案1】:

ListView 基本上类似于ListBox(并从它继承),但它也有一个View 属性。此属性允许您指定显示项目的预定义方式。 BCL (Base Class Library) 中唯一的预定义视图是GridView,但您可以轻松地使用create your own

另一个区别是默认选择模式:Single 对应 ListBox,而 Extended 对应 ListView

【讨论】:

    【解决方案2】:

    ListView 让您为其定义一组views,并为您提供一种本地方式(WPF binding 支持)通过使用定义的views 来控制ListView 的显示。

    示例:

    XAML

    <ListView ItemsSource="{Binding list}" Name="listv" MouseEnter="listv_MouseEnter" MouseLeave="listv_MouseLeave">
            <ListView.Resources>
                <GridView x:Key="one">
                    <GridViewColumn Header="ID" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding id}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Name" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding name}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
                <GridView x:Key="two">                    
                    <GridViewColumn Header="Name" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding name}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.Resources>
            <ListView.Style>
                <Style TargetType="ListView">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ViewType}" Value="1">
                            <Setter Property="View" Value="{StaticResource one}" />
                        </DataTrigger>
                    </Style.Triggers>
                    <Setter Property="View" Value="{StaticResource two}" />
                </Style>
            </ListView.Style>  
    

    Code Behind:

    private int viewType;
    
    public int ViewType
    {
        get { return viewType; }
        set 
        { 
            viewType = value;
            UpdateProperty("ViewType");
        }
    }        
    
    private void listv_MouseEnter(object sender, MouseEventArgs e)
    {
        ViewType = 1;
    }
    
    private void listv_MouseLeave(object sender, MouseEventArgs e)
    {
        ViewType = 2;
    }
    

    输出:

    普通视图:上面的视图 2 XAML

    MouseOver 视图:在上方查看 1 XAML

    如果您尝试在ListBox 中实现上述目标,您可能最终会为ControlTempalate/ItemTemplateListBox 编写更多代码。

    【讨论】:

    • “隐藏代码”部分在 2019 年 4 月 29 日是无效代码(额外的右括号和 UpgradeProperty)。可以改正吗?
    • 已经正确了。 UpdateProperty 是一种通知属性更改的方法。对你来说可能完全不同。使用您用来通知属性更改的任何方法。还有哪个额外的大括号?
    • 谢谢你的解释。你是对的。我想我被大括号的位置迷住了。确实没有多余的大括号。如果您同意,我会重新检查一些代码。
    【解决方案3】:

    Listview 派生自列表框控件。 一个最重要的区别是 listview 默认使用扩展选择模式。 listview 还添加了一个名为 view 的属性,它使您能够以比自定义项目面板更丰富的方式自定义视图。 带有gridview 的listview 的一个真实示例是文件资源管理器的详细信息视图。 带有网格视图的 Listview 是一个功能较弱的数据网格。 引入datagrid控件后listview就失去了它的重要性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2022-08-18
      • 2014-10-09
      相关资源
      最近更新 更多