【问题标题】:Adding items to a WPF DataGrid bound to an ObservableCollection with a custom mutator in MVVM C#在 MVVM C#​​ 中将项目添加到绑定到 ObservableCollection 的 WPF DataGrid
【发布时间】:2016-03-03 18:22:21
【问题描述】:

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

我有一个包含一些简单属性的基类。我们称之为BaseClass。然后我有几个其他类扩展BaseClass。我们称它们为 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 类型的对象,一个只显示 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 ;
    }
}

另外两个是相同的。我将每个数据网格的 ItemSource 绑定到它们的属性。这一切都有效。

用户当前可以编辑数据网格中的任何项目,并且更改会反映在 objs 中。但是,如果用户尝试将项目添加到数据网格,则项目不会添加到 objs,这是正确的;我的属性没有变异器(设置器)。这就是我的问题所在。我无法想出变异器将新对象添加到集合中的样子。有没有人有任何想法?谢谢!

【问题讨论】:

  • 您需要三个单独的集合视图,而不是集合。查看 ICollectionView 接口和 ListCollectionView 类(抱歉,很难从手机发布链接)
  • 您可以使用集合视图或可观察集合,但是您不应该在属性 getter 中创建可观察集合的新实例,这会引发问题。在视图模型级别创建一个单独的实例并使用您的 SubClass1 实例填充它。添加到该集合的任何对象都将自动出现在网格中,如果网格创建了一个新实例,它将自动添加到它所绑定的集合中。使用集合更改事件来检测这些更改。
  • @Dennis 你是说我的属性不是 ObservableCollection 类型,而是 ListCollectionViews 类型?
  • @user469104 我可以尝试类似的方法,看看效果如何。我会告诉你的。
  • @user469104 我确实使用该方法使其工作。感谢您的帮助!

标签: c# wpf mvvm datagrid observablecollection


【解决方案1】:

感谢@user49104,我能够弄清楚。我会在这里为任何需要它的人发布答案。

我更改了我的 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 事件中,我检查以确保没有添加或删除对象并修复 obj:

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

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 2018-04-06
    • 1970-01-01
    • 2023-04-02
    • 2016-02-21
    • 1970-01-01
    • 2021-08-31
    • 2013-10-14
    • 2017-04-16
    相关资源
    最近更新 更多