我有一个可以过滤的项目列表。 Item类有一个属性IsChecked。有时,如果我在过滤列表时更改此属性(在运行时通过复选框),则不会在源集合中更改它。我做错了吗?
public class ViewModel
{
private ObservableCollection<Item> _items;
public ListCollectionView ItemsView { get; private set; }
private bool _checkAll;
public bool CheckAll
{
get
{
return _checkAll;
}
set
{
if (_checkAll == value)
return;
_checkAll = value;
if (_checkAll)
{
foreach (Item i in ItemsView )
i.IsChecked = true;
}
else
{
foreach (Item i in ItemsView )
i.IsChecked = false;
}
OnPropertyChanged("CheckAll");
}
}
public ViewModel()
{
_items= new ObservableCollection<Item>(this.createList());
ItemsView = CollectionViewSource.GetDefaultView(_items) as ListCollectionView;
ItemsView.Filter = filter;
}
private void filter(object obj)
{
...
}
}
public class Item
{
private bool _isChecked;
public Item()
{
}
public bool IsChecked
{
get {return _isChecked; }
set
{
if (_isChecked == value)
return;
_isChecked = value;
OnPropertyChanged("IsChecked");
}
}
...
}
答案 0 :(得分:0)
我认为您的代码没有任何问题,让我解释一下:
执行此操作时:
foreach (Item i in ItemsView )
i.IsChecked = true;
您只为ListView当前显示的项目(即只有通过过滤器的项目)将IsChecked属性设置为true。
如果要将ObservableCollection _items中的所有元素设置为true或false,可以通过两种不同的方式实现:
foreach (Item i in _items) //enumerate the private ObservableCollection
i.IsChecked = true;
或
foreach (Item i in ItemsView.SourceCollection) //enumerate the underlying ObservableCollection
i.IsChecked = true;
如果Item类实现了INotifyPropertyChanged,则UI应该没有问题地反映更改。
编辑1(基于下面的讨论):
检查/取消查看商品的另一种方法是:
public bool CheckAll
{
get { return _checkAll; }
set
{
if (_checkAll == value)
return;
_checkAll = value;
_items.Where(ItemsView.Filter.Invoke).Select(i=>i.IsChecked=_checkAll);
OnPropertyChanged("CheckAll");
}
}
枚举ListView应该可以正常工作,但因为它不是一种解决方法,直接使用您的集合,但考虑到过滤后的元素。
希望这有帮助,尊重!