2013-11-25 51 views
1

我有,我重視的ICollectionView爲如何正確綁定(更新)與CollectionViewSource一個DataGrid

XAML一(WPF)DataGrid中:

<DataGrid x:Name="TodoList" ItemsSource="{Binding TodoItemsCollection}" DataContext="{Binding}" /> 

構造函數(代碼後面)

TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems); 
TodoItemsCollection.Filter = TodoItemsFilter; 

(Storage.TodoItems是一個ObservableCollection)

TodoItemsCollection物業

private ICollectionView _todoItemsCollection; 
public ICollectionView TodoItemsCollection 
{ 
    get { return _todoItemsCollection; } 
    set 
    { 
     if (_todoItemsCollection != value) 
     { 
      _todoItemsCollection = value; 
      OnPropertyChanged("TodoItemsCollection"); 
     } 
    } 
} 

Storage.TodoItems是的ObservableCollection其中一個跟蹤器添加,編輯和刪除項目
此更改應立即顯示在DataGrid中。

但是,問題在於所有這些更改都未反映在DataGrid中(即DataGrid未更新)。
例如,如果我撥打TodoItemsCollection.Refresh(),沒有任何變化。
使用刷新按鈕(僅用於測試目的),我將DataGrid的ItemsSource設置爲null並將其重置(TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);)。
本手冊更新顯示新/更改/刪除的項目。
但是,過濾然後不再工作

我閱讀了大約三十篇博文,但找不到解決我的問題的方法。
通常,撥打Refresh()或重置ItemsSource對他們來說效果不錯。

任何建議真的非常感謝!

+0

避免將綁定集合設置爲null,而應使用Clear()。至於你的問題,你可以嘗試OnPropertyChanged(()=> TodoItemsCollection); – liquidsnake786

+0

對不起,我真的不知道你的意思。我將TodoList.ItemsSource設置爲null。而且我無法在TodoItemsCollection上調用Clear()。我該怎麼辦?謝謝! – casaout

+0

我無法在OnPropertyChanged()中使用LambdaFunction。你如何建議OnPropertyChanged() - 方法應該看起來像?謝謝。 – casaout

回答

2

嘗試使用ObservableCollection而不是ICollectionView,看看它是否有幫助。您應該能夠在該集合調用清除()以及

Sorting

+0

只需將ObservableCollection綁定到DataGrid即可。但我想運行它,這就是爲什麼我使用ICollectionView。或者我誤解你的答案?謝謝。 – casaout

+0

看到這個圖表,也許它會幫助你明白我在說什麼... ... http://blogs.msdn.com/blogfiles/luc/WindowsLiveWriter/SortsandfiltersonObservableCollection_D09D/image4_thumb.png – liquidsnake786

2

除了liquidsnake786答案 - 只要您可以使用的ObservableCollection而不是ICollectionView,並在過濾/整理將工作完全一樣您使用CollectionViewSource.GetDefaultView(Storage.TodoItems)。

更重要的是,Storage.TodoItems應該只是初始化一次否則TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);必須在每次創建新的Storage.TodoItems時調用。只需使用clear()add()和remove()來更改Storage.TodoItems。

編輯:以通常的方式:

- 只是創建一個OberservableCollection一次(例如構造函數內)。這個集合將處理添加和刪除並通知WPF UI。

this.MyCollection = new OberservableCollection<TodoItem>(); 

- 你的包裹項目 「的TodoItem」 應執行INotifyPropertyChanged到notifiy更改/編輯到WPF UI

-create你ICollectionView一次(如內的構造函數)像你這樣

this.MyView = CollectionViewSource.GetDefaultView(MyCollection); 
this.MyView.Filter = TodoItemsFilter; 

- 修改您的源代碼清除,添加,刪除

this.MyCollection.Clear(); 
foreach(var item in MyNewCollectionFromAnywhere) 
{ this.MyCollection.Add(item);} 
this.MyView.Refresh(); 

-b確保你的datacontext和binding在xaml中是正確的:) btw DataContext =「{Binding}」對我來說沒有任何意義。

<DataGrid ItemsSource="{Binding MyView}"/> 
+0

感謝您的回答。我是不是已經通過編寫'TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);'? TodoItems是一個ObservableCollection,其中的項目被添加/修改/刪除。但是我不能在這個列表上運行clear(),因爲我不想改變它。基本上,DataGrid應該只顯示整個ObservableCollection,但允許用戶過濾它(使用單獨的字段)。你能告訴我如何改變我的代碼來使它工作嗎?非常感謝你! – casaout

+0

請參閱我的編輯請讓我知道,如果你也做這些步驟。 – blindmeis

+0

不幸的不是。但它確實幫助我,因爲我可以提高對CollectionViewSources-Stuff的理解。而且,過濾器現在在用戶手動刷新後仍然可以工作。不過,我真的希望找到一個解決方案,不必依靠刷新按鈕。謝謝! – casaout

相關問題