如何使用CollectionViewSource正确绑定(更新)DataGrid

时间:2013-11-25 08:48:26

标签: c# wpf datagrid observablecollection collectionviewsource

我有一个(WPF)DataGrid,我将ICollectionView附加为

XAML:

 <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对他们来说效果很好。

非常感谢任何建议 !!

2 个答案:

答案 0 :(得分:3)

除了liquidnake786回答 - 你可以使用ObservableCollection而不是ICollectionView,只要你使用CollectionViewSource.GetDefaultView(Storage.TodoItems),过滤/排序就会一样。

更重要的是,Storage.TodoItems应该只初始化一次,否则TodoItemsCollection = CollectionViewSource.GetDefaultView(Storage.TodoItems);必须在每次创建新的Storage.TodoItems时调用。只需使用clear()add()和remove()来改变你的Storage.TodoItems。

编辑:通常的方式:

- 只需创建一次OberservableCollection(例如,在ctor中)。此集合将处理添加和删除并通知WPF ui。

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

-your wrapped item“TodoItem”应该实现INotifyPropertyChanged以通知对WPF ui的更改/编辑

- 像你一样(例如在ctor中)创建ICollectionView一次

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

- 使用clear,add,remove

更改源集合
 this.MyCollection.Clear();
 foreach(var item in MyNewCollectionFromAnywhere)
 { this.MyCollection.Add(item);}
 this.MyView.Refresh();

- 确保你的datacontext和绑定在xaml中是正确的.btw DataContext =“{Binding}”对我来说毫无意义。

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

答案 1 :(得分:2)

尝试使用ObservableCollection而不是ICollectionView,看看它是否有帮助。您应该能够在该集合上调用Clear()

Sorting