使用 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。我们称它们为 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 类型的对象,一个只显示 [=] 类型的对象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 在这里为任何需要它的人提供答案。
我更改了 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);
}
如果我先解释我的代码结构,然后尝试提出我的问题,这将是最简单的。
我有一个包含一些简单属性的基础 class。我们将其称为 BaseClass。然后我有几个扩展 BaseClass 的其他 classes。我们称它们为 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 类型的对象,一个只显示 [=] 类型的对象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 在这里为任何需要它的人提供答案。
我更改了 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);
}