ListBox和ListView有什么区别


198

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

Answers:


211

A ListView基本上像a ListBox(并从其继承),但它也具有View属性。此属性使您可以指定显示项目的预定义方式。BCL(基类库)中唯一的预定义视图是GridView,但是您可以轻松创建自己的视图。

另一个区别是默认选择模式:Single用于ListBox,但Extended用于ListView


32

一个ListView让你定义了一套views它并为您提供原生的方式(WPF binding支持)来控制的显示ListView,通过使用规定views

例:

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/ ItemTemplateof 编写更多代码ListBox


截至2019年4月29日,“隐藏代码”部分无效(额外的大括号和UpgradeProperty)。可以纠正吗?
Frederic

2
已经对了 UpdateProperty是一种通知属性更改的方法。对于您来说,它可能完全不同。使用您要用来通知属性更改的任何方法。还有哪个额外的括号?
Kylo Ren

好,谢谢您的解释。你是对的。我想我对括号位置很着迷。确实没有多余的括号。如果您同意,我将重新编写一些代码。
Frederic

9

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.