ListBox 和 ListView 有啥区别

Posted

技术标签:

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

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

【问题讨论】:

答案中未提及:ListView 有列标题,ListBox 没有 【参考方案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就失去了它的重要性。

【讨论】:

以上是关于ListBox 和 ListView 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

〝WPF〞中的〝ListBox〞、〝ListView〞和〝DataGridView〞有啥区别?

WPF中的ListBox,ListView和DataGridView有啥区别

c# ListView和DataGridView 有啥区别

突出显示 ListView 和 ListBox 控件中的第一行

qt设计师左侧栏里的item view和item widgets有啥区别吗,如下图,求解

用于多列使用的 ListView 与 ListBox