Jaka jest różnica między ListBox a ListView

198

Jaka jest różnica między ListBox WPF a ListView? Nie mogę znaleźć żadnej znaczącej różnicy w ich właściwościach. Czy jest inne typowe zastosowanie?

Rasto
źródło

Odpowiedzi:

211

A ListViewjest w zasadzie jak ListBox(i dziedziczy po nim), ale ma także Viewwłaściwość. Ta właściwość umożliwia określenie predefiniowanego sposobu wyświetlania elementów. Jedynym predefiniowanym widokiem w BCL ( Biblioteka klas podstawowych ) jest GridView, ale możesz łatwo stworzyć swój własny .

Kolejną różnicą jest domyślny tryb wyboru: jest Singledla ListBox, ale ExtendeddlaListView

Thomas Levesque
źródło
32

ListViewPozwalają zdefiniować zestaw viewsdla niego i daje natywną sposób ( WPF bindingSupport) do sterowania wyświetlaniem ListViewprzez korzystając z definicją views.

Przykład:

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

WYNIK:

Widok normalny: widok 2 powyżej XAML

Normalna

Widok myszy: widok 1 powyżej XAML

Najedź myszką

Jeśli spróbujesz osiągnąć powyższe w ListBox, prawdopodobnie skończysz pisać o wiele więcej kodu dla ControlTempalate/ ItemTemplatez ListBox.

Kylo Ren
źródło
Sekcja Code Behind nie jest poprawnym kodem na dzień 29.04.2019 (dodatkowe nawiasy zamykające i UpgradeProperty). Czy można to poprawić?
Frederic
2
To jest już poprawne. UpdateProperty to metoda powiadamiania o zmianie właściwości. Może być dla ciebie zupełnie inaczej. Użyj wszędzie tam, gdzie używasz metody powiadamiania o zmianie właściwości. i który dodatkowy aparat ortodontyczny?
Kylo Ren
Cóż, dziękuję za wyjaśnienie. I masz rację. Myślę, że byłem zahipnotyzowany lokalizacjami aparatu. Rzeczywiście nie ma żadnych dodatkowych aparatów ortodontycznych. Zmienię kod, jeśli się zgodzisz.
Frederic
9

Widok listy pochodzi ze sterowania listbox. Jedną z najważniejszych różnic jest to, że widok listy domyślnie korzysta z trybu rozszerzonego wyboru. listview dodaje również właściwość o nazwie view, która pozwala dostosować widok w bogatszy sposób niż niestandardowy element iteman. Jednym z prawdziwych przykładów widoku listy z widokiem siatki jest widok szczegółów eksploratora plików. Widok listy z widokiem siatki jest mniej wydajną siatką danych. Po wprowadzeniu kontroli kontrolnej datagrid widok listy stracił na znaczeniu.

iaminvinicble
źródło