Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 可观察集合未更新datagrid_Wpf_Vb.net_Observablecollection - Fatal编程技术网

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设置为视图模型并绑定到视图模型的属性

    Dim vm as new MyViewModel()
    DataContext = vm
    vm.Items = new ObservableCollection(Of PriceListPrime)(GetAll())        
    
    视图模型将实现INotifyPropertyChanged,并在
    属性更改时引发PropertyChanged事件。在Xaml中,数据网格的
    ItemsSource
    将绑定到
    Items
    属性


如何应对这种情况,ObservableCollection是否有一些属性或方法?您可以按照“不可见”的建议进行操作,但您当前的解决方案更简单、更快。如果我完全使用MyViewModel而不是所有的价格表,绑定可能会起作用,这也允许我在不使用ctype的情况下使用查询,因为之前的查询是使用(T)类型的。会吗?你能给我指一个能提供更多信息的来源吗?你需要更多关于哪一点的信息?我猜是MVVM和DataContext的使用。继续搜索,将会有大量的资源。这就是MVVM的用途。谢谢你,我会尽量多花点时间的。
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())