2010-08-26 86 views
0

我正在使用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")); 
    } 
} 
+0

为什么不使用正常的C#事件,而不是消息?我猜想父对象知道它的子对象,以便它可以订阅它的子对象事件?!顺便说一句:如果你能提供一些描述你场景的(伪)代码,这将是一件好事...... – gehho 2010-08-26 12:03:22

回答

1

假设您使用Galaxoft的MVVM-Light(只是猜测; P),有几种方法。

一,通过分配两个对象都知道的令牌,并将该消息与该令牌一起发送。只有使用该令牌注册的收件人才会收到该消息。

二,指定消息对象的Target属性,并让收件人检查它。所有注册的收件人都将收到该消息,但他们可以根据消息的目标属性选择是否要做出反应。

使用消息系统的好工作,它很难;)

+0

问题在于这种情况下的性能。如果让我们说10个对象,我检查这个对象是否是一个合适的接收器,这不是问题。但是,如果将有10000个或更多个具有特定消息类型的对象实例注册,则性能可能成为问题。 – Bartek 2010-08-31 11:52:55

+0

在这种情况下,也许您应该避开消息传递系统并使用标准做法和事件,例如INotifyPropertyChanged和INotifyCollectionChanged,以获取您所描述的通知;你可以将它们组合成一个ObservableItemCollection(名字来自RIA Services我认为),它是一个可观察的集合,它也代表它所包含的对象引发属性改变的事件。当然,这意味着当它添加到集合中时,您必须注册到每个项目的PropertyChanged事件,因此您仍然会获得较低的性能提升。 – 2010-09-01 06:31:15