2012-05-06 46 views
3

我正在使用Dim All_PriceLists As System.Collections.ObjectModel.ObservableCollection(Of BSPLib.PriceLists.PriceListPrime)其中PriceListPrime爲其中的所有屬性實施了Inotify。Observable Collection未更新數據網格

我將All_PriceList綁定到數據網格爲DataGrid1.ItemsSource = All_PriceLists,但是當我做All_PriceLists=Getall()其中Getall讀取並從數據庫獲取數據時,數據網格未更新。

它只有當我這樣本事更新:

DataGrid1.ItemsSource = Nothing 
DataGrid1.ItemsSource = All_PriceLists 

能否請你告訴我在哪裏出了問題或者我應該實現。謝謝。

回答

4

您有幾種解決方案,您的問題

  • 更新的ItemsSource直接

    DataGrid1.ItemsSource = new ObservableCollection(Of PriceListPrime)(GetAll()) 
    
  • 更新(如在另一個答案自提)的ObservableCollection

    All_PriceList.Clear(); 
    For Each item in Getall() 
        All_PriceList.Add(item) 
    Next 
    
  • 將您的Dat aContext到視圖模型和綁定到視圖模型

    Dim vm as new MyViewModel() 
    DataContext = vm 
    vm.Items = new ObservableCollection(Of PriceListPrime)(GetAll())   
    

    視圖模型將執行INotifyPropertyChanged並且當Items屬性更改升高PropertyChanged事件的屬性。在Xaml中,您的DataGrid的ItemsSource將綁定到Items屬性。

+0

如果我完全使用MyViewModel而不是All_PriceLists,可以進行綁定工作,這也允許我使用ctype進行查詢,因爲前一個是(T)類型的。會嗎?你能否指點我一個可以提供更多信息的來源。 – surpavan

+0

你需要哪些信息?我猜測它是MVVM和DataContext的使用。在SO上搜索,會有很多資源。 – Phil

+0

這就是MVVM的用途。謝謝,我會盡量花更多時間在它上面。 – surpavan

2

問題是你沒有更新集合,你正在更換它,這是不同的。 datagrid仍然綁定到舊列表,並且更新的數據存儲在新的未綁定集合中。所以,你不是黑客的解決方案,你的數據網格綁定到新的集合,這是正確的。

如果你想要一個更自動的解決方案,你應該綁定你的datagrid到一個數據集/ datatable,這是完全不同的代碼。

+0

怎樣才能反擊這種情況,是否有ObservableCollection的一些屬性或方法? – surpavan

+0

你可以做'隱形'建議,但你現在的解決方案更簡單,更快。 – 2012-05-06 17:21:15

2

如果您希望應用程序對您的更改做出反應,您應該更新ObservableCollection而不是創建新的。

因此,清除All_PriceList集合並添加新項目。例如:

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

的ObservableCollection不支持的AddRange,所以你必須通過一個添加的項目之一或實施INotifyCollectionChanged在自己的收藏。 (而不是替換本地成員變量)

相關問題