使用 MVVM C#​​ 中的自定义修改器将项目添加到绑定到 ObservableCollection 的 WPF DataGrid

Adding items to a WPF DataGrid bound to an ObservableCollection with a custom mutator in MVVM C#

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

我有一个包含一些简单属性的基础 class。我们将其称为 BaseClass。然后我有几个扩展 BaseClass 的其他 classes。我们称它们为 SubClass1Subclass2SubClass3。现在我有了这个视图模型,它包含这个私有成员:

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 类型的对象,一个只显示 [=] 类型的对象25=]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 中,这是正确的;我的属性没有 mutators(setters)。这就是我的问题所在。我无法想出将新对象添加到集合中时,增变器会是什么样子。有人有什么想法吗?谢谢!

多亏了@user49104,我才弄明白了。我会 post 在这里为任何需要它的人提供答案。

我更改了 SubClass1SubClass2SubClass3 集合的属性,使其具有普通的更普通的访问器和修改器,并为每个创建了一个私有成员:

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