Wpf 可观察集合未更新datagrid
我使用Wpf 可观察集合未更新datagrid,wpf,vb.net,observablecollection,Wpf,Vb.net,Observablecollection,我使用Dim All_PriceLists作为System.Collections.ObjectModel.ObservableCollection(属于BSPLib.PriceLists.PriceListPrime)其中PriceListPrime为其中的所有属性实现Inotify 我将All\u PriceList作为DataGrid1.ItemsSource=All\u PriceLists绑定到数据网格,但是当我执行All\u PriceLists=Getall()时,Getall从数
Dim All_PriceLists作为System.Collections.ObjectModel.ObservableCollection(属于BSPLib.PriceLists.PriceListPrime)
其中PriceListPrime
为其中的所有属性实现Inotify
我将All\u PriceList
作为DataGrid1.ItemsSource=All\u PriceLists
绑定到数据网格,但是当我执行All\u PriceLists=Getall()
时,Getall从数据库读取并获取数据,数据网格不会更新
只有当我以这种方式破解它时,它才会更新:
DataGrid1.ItemsSource = Nothing
DataGrid1.ItemsSource = All_PriceLists
你能告诉我哪里出了问题,或者我应该实施什么吗。谢谢。问题是您没有更新收藏,而是在替换它,这是不同的。 datagrid仍然绑定到旧列表,更新的数据存储在新的未绑定集合中。因此,您不是在攻击解决方案,而是将datagrid绑定到新集合,这是正确的
如果你想要一个更自动化的解决方案,你应该将你的datagrid绑定到一个数据集/数据表,这是完全不同的代码。如果你想让应用程序对你的更改做出反应,你应该更新ObservableCollection,而不是创建一个新的 因此,清除
All_PriceList
collection并向其中添加新项目。例如:
All_PriceList.Clear();
For Each item in Getall()
All_PriceList.Add(item)
Next
ObservableCollection不支持AddRange,因此您必须逐个添加项,或在自己的集合中实现
INotifyCollectionChanged
。您有多种解决方案
- 直接更新ItemsSource(而不是替换本地成员变量)
- 更新ObservableCollection(如另一个答案中所述)
- 将DataContext设置为视图模型并绑定到视图模型的属性
视图模型将实现INotifyPropertyChanged,并在Dim vm as new MyViewModel() DataContext = vm vm.Items = new ObservableCollection(Of PriceListPrime)(GetAll())
属性更改时引发PropertyChanged事件。在Xaml中,数据网格的项
将绑定到ItemsSource
属性Items
All_PriceList.Clear();
For Each item in Getall()
All_PriceList.Add(item)
Next
Dim vm as new MyViewModel()
DataContext = vm
vm.Items = new ObservableCollection(Of PriceListPrime)(GetAll())