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