Observable Collection不会更新数据网格

时间:2012-05-06 16:16:25

标签: wpf vb.net observablecollection

我正在使用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

你能告诉我我哪里出错或者我应该实施什么。谢谢。

3 个答案:

答案 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