Skip to content

WPF中的ListView绑定数据源

约 605 字大约 2 分钟

WPF异步

2025-09-06

数据源绑定方法

将ListView绑定数据源,当数据源发生变化的时候,ListView会更新。

1、定义数据模型

比如:图书搜索下载ListView案例中,有Header:书名、作者、格式、大小、下载地址、下载进度。这6个Header,那么我可以这样定义:

// 定义一个类来表示书籍信息,用于绑定到ListView
public class BookInfo
{
    public string Name { get; set; }
    public string Author { get; set; }
    public string Format { get; set; }
    public string Size { get; set; }
    public string Link { get; set; }
    public string Progress { get; set; }
}

2、准备数据源绑定

在 ViewModel 或后台代码中,创建一个可观察集合(ObservableCollection)作为数据源(它会自动通知 UI 数据变化):

// 可观察集合,用于绑定到ListView
public ObservableCollection<BookInfo> Book { get; set; }
public MainWindow()
{
    InitializeComponent();
    // 将数据源绑定到ListView
    Book = new ObservableCollection<BookInfo>(); // 实例化一个可观察的BookInfo类型的集合
    infoListView.ItemsSource = Book; // 与对应的ListView绑定
}

3、在 XAML 中定义 ListView

在 XAML 中定义 ListView 的列结构,并绑定到数据模型的属性:

<ListView x:Name="infoListView" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="9" Margin="10">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="书名" Width="200"
                            DisplayMemberBinding="{Binding Name}"/> <!-- 第一列:绑定到Name属性 -->
            <GridViewColumn Header="作者" Width="150" 
                            DisplayMemberBinding="{Binding Author}"/> <!-- 第二列:绑定到Author属性 -->
            <GridViewColumn Header="格式" Width="80"
                            DisplayMemberBinding="{Binding Format}"/> <!-- 第三列:绑定到Format属性 -->
            <GridViewColumn Header="大小" Width="80" 
                            DisplayMemberBinding="{Binding Size}"/> <!-- 第四列:绑定到Sizw属性 -->
            <GridViewColumn Header="下载地址" Width="80" 
                            DisplayMemberBinding="{Binding Link}"/> <!-- 第五列:绑定到Link属性 -->
            <GridViewColumn Header="下载进度" Width="150" 
                            DisplayMemberBinding="{Binding Progress}"/> <!-- 第六列:绑定到Progress属性 -->
        </GridView>
    </ListView.View>
</ListView>

4、动态添加数据

通过修改数据源即可动态添加行

Book.Add(new BookInfo { Name = "C#入门经典", Author = "张三", Format = "PDF", Size = "5MB", Link = "http://example.com/book1", Progress = "未下载" });

添加测试数据效果

5、更新UI

如果不在主线程或UI线程,那么需要用到,作用就是将指定的代码 “调度” 到 UI 线程执行,确保 UI 操作的线程安全性。

阻塞当前线程更新UI

Dispatcher.Invoke(() =>
{
    currentItem.Progress = progress;
    infoListView.Items.Refresh();
});

异步更新UI

Dispatcher.BeginInvoke(new Aciton(() =>
{
    currentItem.Progress = progress;
    infoListView.Items.Refresh();
}));

本博客采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可