3

I am using a Dim All_PriceLists As System.Collections.ObjectModel.ObservableCollection(Of BSPLib.PriceLists.PriceListPrime) where PriceListPrime implements Inotify for all properties in it.

I bound the All_PriceList to a datagrid as DataGrid1.ItemsSource = All_PriceLists but when I do All_PriceLists=Getall() where Getall reads and gets the data from the DB, the datagrid is not updating.

It updates only when I hack it this way:

DataGrid1.ItemsSource = Nothing
DataGrid1.ItemsSource = All_PriceLists

Could you please tell me where I have gone wrong or what I should implement. Thank you.

4

3 回答 3

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())        
    

    Items视图模型将实现 INotifyPropertyChanged 并在属性更改时引发 PropertyChanged 事件。在 Xaml 中,您的 DataGridItemsSource将绑定到该Items属性。

于 2012-05-06T17:20:16.183 回答
2

如果您希望应用程序对您的更改做出反应,您应该更新 ObservableCollection 而不是创建新的。

因此,清除All_PriceList收藏并将新项目添加到其中。例子:

All_PriceList.Clear();
For Each item in Getall()
  All_PriceList.Add(item)
Next

ObservableCollection 不支持 AddRange,所以你必须一个一个地添加项目或者INotifyCollectionChanged在你自己的集合中实现。

于 2012-05-06T16:59:29.630 回答
2

问题是您不是在更新集合,而是在替换它,这是不同的。数据网格仍然绑定到旧列表,更新的数据存储在新的未绑定集合中。因此,您不是在破解解决方案,而是将数据网格绑定到新集合,这是正确的。

如果你想要一个更自动化的解决方案,你应该将你的数据网格绑定到一个数据集/数据表,这是完全不同的代码。

于 2012-05-06T16:33:34.770 回答