我正在使用MVVM构建我的第一个应用程序,并且卡住了。使用信使交流其他ViewModel关于一些改变工作正常,直到我试图建立一个observablecollection对象。我有一个类(myClass),它包含一个列表(innerList)。 innerLists的元素应该向其父母发送消息(以通知他们已更改或应该删除)。我从innerList对象发送消息。此消息已在myClass中注册。wpf mvvm - 如何发送消息只给父母?
问题是我需要创建myClass对象的ObservableCollection。正如我理解发送 - 接收消息的想法,myClass的每个实例都将接收innerList元素发送的消息。目标是只能在父类myClass对象中接收消息,而不能在myClass的每个对象中接收消息。
我描述的结构要复杂得多,所以这只是情况的草图。这个问题 - 是否可以使用Messenger的发送寄存器功能仅向父对象发送消息。也许它应该以其他方式解决?
下面是如何建立这两个类。我把它缩短到只有这个,这里重要。
public class ObjTypeListVM : ViewModelBase
{
private ObservableCollection<ObjTypeVM> objTypeList = new ObservableCollection<ObjTypeVM>();
public ObjTypeListVM()
{
Messenger.Default.Register<Messages.ObjTypeModifiedMsg>(this, ObjTypeModified);
}
public ObservableCollection<ObjTypeVM> ObjTypeList
{
get { return objTypeList; }
}
public void ObjTypeModified(Messages.ObjTypeModifiedMsg msg)
{
switch (msg.Type)
{...
case "delete":
Delete(msg.ObjType);
break;
default:
break;
}
}
public void Delete(ObjTypeVM objType)
{...
ObjTypeList.Remove(objType);
}
}
public class ObjTypeVM : ViewModelBase
{
private XmlSTSLib.ObjType objType;
int objTypeId;
private RelayCommand deleteItemCmd;
public ObjTypeVM(ObjType _objType, int _objTypeId)
{ ... }
public int ObjTypeId
{
get { return this.objTypeId; }
set { this.objTypeId = value; RaisePropertyChanged("ObjTypeId"); }
}
public RelayCommand DeleteItemCmd
{
get
{
if (deleteItemCmd == null)
{
deleteItemCmd = new RelayCommand(Delete);
}
return deleteItemCmd;
}
}
public void Delete()
{
Messenger.Default.Send<Messages.ObjTypeModifiedMsg>(new Messages.ObjTypeModifiedMsg(this, "delete"));
}
}
为什么不使用正常的C#事件,而不是消息?我猜想父对象知道它的子对象,以便它可以订阅它的子对象事件?!顺便说一句:如果你能提供一些描述你场景的(伪)代码,这将是一件好事...... – gehho 2010-08-26 12:03:22