外观
WPF中的ListView绑定数据源
数据源绑定方法
将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();
}));