В чем разница между ListBox и ListView


200

В чем разница между ListBox WPF и ListView? Я не могу найти какой-либо существенной разницы в их свойствах. Есть ли другое типичное использование?

Ответы:


213

A ListViewв основном похож на ListBox(и наследует от него), но у него также есть Viewсвойство. Это свойство позволяет указать предопределенный способ отображения элементов. Единственное предопределенное представление в BCL ( библиотека базовых классов ) GridView, но вы можете легко создать свое собственное .

Другим отличием является режим выбора по умолчанию: это Singleдля ListBox, но ExtendedдляListView


33

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 View: вид 1 выше XAML

Мышь над

Если вы попытаетесь достичь выше в a ListBox, вероятно, вы в конечном итоге будете писать гораздо больше кода для ControlTempalate/ ItemTemplateof ListBox.


Код Code Behind является недействительным кодом по состоянию на 2019-04-29 (дополнительная закрывающая скобка и UpgradeProperty). Это можно исправить?
Фредерик

2
Это уже правильно. UpdateProperty - это метод уведомления об изменении свойства. Это может быть совершенно другим для вас. Используйте везде, где вы используете метод уведомления об изменении свойства. а какая лишняя скобка?
Kylo Ren

Хорошо, спасибо за объяснение. И ты прав. Я предполагаю, что я был загипнотизирован местоположениями скобки. Там действительно нет лишних скобок. Я сделаю небольшой пересмотр кода, если вы согласны.
Фредерик

9

Listview происходит из списка управления. Одним из наиболее важных отличий является то, что просмотр списка использует расширенный режим выбора по умолчанию. В listview также добавлено свойство под названием view, которое позволяет настраивать представление более богатым способом, чем настраиваемая панель элементов. Одним из реальных примеров просмотра списка с gridview является просмотр сведений о проводнике. Listview с сеткой - менее мощная сетка данных. После введения datagrid контрольный просмотр списка потерял свое значение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.