使用MVVM C中的自定义mutator将项添加到绑定到ObservableCollection的WPF DataGrid#

时间:2016-03-03 18:22:21

标签: c# wpf mvvm datagrid observablecollection

如果我首先解释我的代码结构,那么这将是最简单的,然后尝试提出我的问题。

我有一个包含一些简单属性的基类。我们将这个 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添加到集合中的新对象。有没有人有任何想法?谢谢!

1 个答案:

答案 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);
}