我有一个(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
对他们来说效果很好。
非常感谢任何建议 !!
答案 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()