如果我首先解释我的代码结构,那么这将是最简单的,然后尝试提出我的问题。
我有一个包含一些简单属性的基类。我们将这个 BaseClass 称为。然后我有几个扩展 BaseClass 的其他类。我们将这些 SubClass1 , Subclass2 和 SubClass3 称为。现在我有了这个视图模型,它包含这个私有成员:
private ObservableCollection<BaseClass> objs = new ObservableCollection<BaseClass>();
视图模型的初始化程序包含以下内容:
objs.Add(new SubClass1(attribute1, attribute2));
objs.Add(new SubClass3(attribute1, attribute2));
objs.Add(new SubClass1(attribute1, attribute2));
objs.Add(new SubClass2(attribute1, attribute2));
现在,在这种情况下,我有3个独立的数据网格。我希望所有三个都从 objs 中提取,但我希望只显示 SubClass1 类型的对象,一个只显示 SubClass2 类型的对象,最后一个只显示 SubClass3 类型的对象。我已成功地通过为每个创建属性来实现此目的:
public ObservableCollection<SubClass1> SubClass1Objs
{
get
{
ObservableCollection<SubClass1> subObjs = new ObseleCollection<SubClass1>();
if (objs != null)
foreach (BaseClass obj in objs)
if(obj.GetType() == typeof(SubClass1))
subObjs .Add((SubClass1)obj);
return subObjs ;
}
}
另外2个是相同的。我将每个数据网格的 ItemSource 绑定到它们的属性。一切正常。
用户当前可以编辑数据网格中的任何项目,更改将反映在 objs 中。但是,如果用户尝试将项添加到数据网格,则项目不会添加到objs,这是正确的;我的属性没有变异器(setter)。这是我的问题所在。我无法想出将mutators添加到集合中的新对象。有没有人有任何想法?谢谢!
答案 0 :(得分:0)
感谢@ user49104,我能够弄明白。我会在这里为任何需要它的人发布答案。
我更改了 SubClass1 , SubClass2 和 SubClass3 集合的属性,以使普通的更正常的访问者和更改者成为私有成员对于每个人:
private ObservableCollection<SubClass1> _SubClass1Objs ;
public ObservableCollection<SubClass1> SubClass1Objs {
get { if (_SubClass1Objs== null) _SubClass1Objs = new ObservableCollection<SubClass1>(); return _SubClass1Objs; }
set { if (_SubClass1Objs!= value) { _SubClass1Objs= value; RaisePropertyChanged("SubClass1Objs"); } }
}
在我的视图模型的初始值设定项中,设置 SubClass 数据:
SubClass1Objs= new ObservableCollection<SubClass1>();
if (objs != null)
foreach (BaseClass obj in objs.Where(c => c.GetType() == typeof(SubClass1)))
SubClass1Objs.Add((SubClass1)card);;
SubClass1Objs.CollectionChanged += SubClass1Objs_CollectionChanged;
最后,在CollectionChanged事件中,我检查以确保没有添加或删除任何对象并修复objs:
// Check if a card was added
foreach (SubClass1 obj in SubClass1Objs)
if (!objs.Contains(obj))
objs.Add(obj);
// Check if a card has been deleted
for (int i = 0; i < objs.Where(c => c.GetType() == typeof(SubClass1)).Count(); ++i)
{
BaseClass obj = objs.Where(c => c.GetType() == typeof(SubClass1)).ElementAt(i);
if (!SubClass1Objs.Contains(obj))
objs.Remove(obj);
}