อะไรคือความแตกต่างระหว่าง ListBox และ ListView


200

ListBox ของ WPF กับ ListView แตกต่างกันอย่างไร ฉันไม่พบความแตกต่างอย่างมีนัยสำคัญในคุณสมบัติของพวกเขา มีการใช้งานทั่วไปแตกต่างกันอย่างไร

คำตอบ:


213

A ListViewนั้นเป็นเหมือนListBox(และสืบทอดมาจากมัน) แต่ก็มีViewคุณสมบัติเช่นกัน คุณสมบัตินี้ช่วยให้คุณระบุวิธีการแสดงรายการที่กำหนดไว้ล่วงหน้า มุมมองที่กำหนดไว้ล่วงหน้าเฉพาะใน BCL ( ห้องสมุดชั้นฐาน ) เป็นGridViewแต่คุณสามารถสร้างของคุณเอง

ข้อแตกต่างอีกประการคือโหมดการเลือกเริ่มต้น: Singleสำหรับ a ListBoxและExtendedสำหรับ aListView


33

ListViewช่วยให้คุณสามารถกำหนดชุดของviewsมันและช่วยให้คุณวิธีพื้นเมือง ( WPF bindingสนับสนุน) เพื่อควบคุมการแสดงผลของโดยใช้กำหนดListViewviews

ตัวอย่าง:

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-04-29 (วงเล็บปิดพิเศษและ UpgradeProperty) สามารถแก้ไขได้ไหม?
เฟรเดอริก

2
มันถูกต้องแล้ว UpdateProperty เป็นวิธีการแจ้งเตือนการเปลี่ยนแปลงคุณสมบัติ อาจแตกต่างกันโดยสิ้นเชิงสำหรับคุณ ใช้วิธีใดก็ตามที่คุณใช้เพื่อแจ้งการเปลี่ยนแปลงคุณสมบัติ และรั้งใดพิเศษ
Kylo Ren

ขอบคุณมากสำหรับคำอธิบาย และคุณพูดถูก ฉันเดาว่าฉันถูกสะกดจิตโดยสถานที่รั้ง ไม่มีวงเล็บปีกกาพิเศษ ฉันจะทำให้โค้ดเล็กน้อยหากคุณเห็นด้วย
เฟรเดอริก

9

Listview มาจากการควบคุมกล่องรายการ ความแตกต่างที่สำคัญอย่างหนึ่งคือ listview ใช้โหมดการเลือกแบบขยายตามค่าเริ่มต้น listview ยังเพิ่มคุณสมบัติที่เรียกว่ามุมมองซึ่งช่วยให้คุณสามารถปรับแต่งมุมมองในแบบที่สมบูรณ์ยิ่งขึ้นกว่า itemspanel ที่กำหนดเอง ตัวอย่างหนึ่งในชีวิตจริงของ listview พร้อม gridview คือมุมมองรายละเอียดของ file explorer Listview พร้อมมุมมองกริดเป็นกริดข้อมูลที่มีประสิทธิภาพน้อย หลังจากการแนะนำของ listagrid ควบคุม listview สูญเสียความสำคัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.