ListBox和ListView有什么区别?

255

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


未在答案中提到:ListView 有列标题,而 ListBox 没有。 - Shahin Dohan
3个回答

268

ListView 基本上类似于一个 ListBox(并且从它继承),但是它还有一个名为 View 的属性。该属性允许您指定预定义的显示项目的方式。在 BCL(Base Class Library)中,仅有一个预定义视图 GridView,但您可以轻松地创建您自己的视图

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


47
一个 ListView 允许你为其定义一组views,并使用定义的views以本地方式(WPFbinding支持)控制 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>  

后台代码:

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

输出:

普通视图: 查看上面XAML的第2个视图

Normal

鼠标悬停视图: 查看上面XAML的第1个视图

Mouse Over

如果您尝试在ListBox中实现以上功能,可能需要编写更多的ControlTemplate/ItemTemplate代码。


截至2019年4月29日,“Code Behind”部分的代码无效(存在额外的闭合括号和“UpgradeProperty”)。能否进行更正? - Frederic
2
已经正确了。UpdateProperty是一种通知属性更改的方法。它对你来说可能完全不同。使用您正在使用的任何通知属性更改的方法。还有哪个额外的大括号? - Kylo Ren
谢谢你的解释。你说得对。我想我被大括号的位置迷住了。确实没有多余的大括号。如果你同意的话,我会重新审视一下代码。 - Frederic

16

Listview继承自listbox控件。 其中一个最重要的区别是,listview默认使用扩展选择模式。listview还添加了一个名为view的属性,使您可以以比自定义itemspanel更丰富的方式自定义视图。 具有gridview的listview的一个真实示例是文件资源管理器的详细信息视图。 带有gridview的listview是一个功能较弱的数据网格。 在datagrid控件推出后,listview失去了其重要性。


1
其中一半是琐碎的内容,另一半是您的个人意见。 - Boppity Bop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接