【发布时间】:2016-03-03 18:22:21
【问题描述】:
如果我首先解释我的代码结构,然后尝试提出我的问题,这将是最简单的。
我有一个包含一些简单属性的基类。我们称之为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 ;
}
}
另外两个是相同的。我将每个数据网格的 ItemSource 绑定到它们的属性。这一切都有效。
用户当前可以编辑数据网格中的任何项目,并且更改会反映在 objs 中。但是,如果用户尝试将项目添加到数据网格,则项目不会添加到 objs,这是正确的;我的属性没有变异器(设置器)。这就是我的问题所在。我无法想出变异器将新对象添加到集合中的样子。有没有人有任何想法?谢谢!
【问题讨论】:
-
您需要三个单独的集合视图,而不是集合。查看 ICollectionView 接口和 ListCollectionView 类(抱歉,很难从手机发布链接)
-
您可以使用集合视图或可观察集合,但是您不应该在属性 getter 中创建可观察集合的新实例,这会引发问题。在视图模型级别创建一个单独的实例并使用您的 SubClass1 实例填充它。添加到该集合的任何对象都将自动出现在网格中,如果网格创建了一个新实例,它将自动添加到它所绑定的集合中。使用集合更改事件来检测这些更改。
-
@Dennis 你是说我的属性不是 ObservableCollection 类型,而是 ListCollectionViews 类型?
-
@user469104 我可以尝试类似的方法,看看效果如何。我会告诉你的。
-
@user469104 我确实使用该方法使其工作。感谢您的帮助!
标签: c# wpf mvvm datagrid observablecollection