正确处理由MVVM父级中的子级引发的事件

时间:2012-08-21 15:01:39

标签: c# wpf mvvm

我在这里简化了一点:

我有一个标签控件,并希望各个标签能够创建更多标签;兄弟姐妹,如果你愿意的话。所以我调用了tab控件的父项,它的标签页面是孩子们。

使用MVVM,我的选项卡控件视图模型是这样的:

class ParentViewModel
{
    ObservableCollection<ChildViewModel> _pages;

    public ObservableCollection<ChildViewModel> Pages
    {
        get
        {
            if (_pages == null)
                _pages = new ObservableCollection<ChildViewModel>();
            return _pages;
        }
    }

    public ParentViewModel()
    {
        Pages.Add(new ChildViewModel());
    }
}

所以我在ParentViewModel上有一组ChildViewModel对象。

这是一种享受,从ParentViewModel内部,我当然可以轻松地将我想要的所有额外的ChildViewModel对象添加到我的集合中,并将它们很好地反映在我的视图中。

我想要做的是允许在ChildView上按下按钮(例如),以便在ParentViewModel对象的集合中添加另一个ChildViewModel。

我已经阅读了很多关于中继命令,路由命令,相对源绑定,依赖注入模式等等的内容,但是有人可以告诉我请“正确”(在MVVM意义上)实现这一点的方式,以及如何这是最好的。谢谢!

2 个答案:

答案 0 :(得分:3)

我喜欢处理这种情况的方法之一是使用Event Aggregating。

这是Unity添加的功能(如果您尚未使用它)

基本上,您将事件聚合器添加到您的依赖注入中,然后您的父母将订阅该事件的监听器,您的孩子将发布该事件。

关于这一点的好处是孩子们没有听谁的概念,而父母只知道它有一个事件请求要处理。有关详细信息,请访问HERE!

答案 1 :(得分:0)

您可以使用MVVM Lit e Messenger课程(或自己编写):

并将一个来自childe类的消息发送给Parent类。查看示例here

创建一个消息类:

public class AddNewChildMessage 
{
  public string Data {get;set;} //any data you need to pass
}

在ParrentViewModel的构造函数中:

Messenger.Default.Register<AddNewChildMessage>
( 
     this, 
     ( message ) => AddNewChild(message ) 
);


private void AddNewChild(AddNewChildMessage message) 
{
  //do staf with message.Data if any
  Pages.Add(new ChildViewModel());
}

在子视图模型中:

Messenger.Default.Send<AddNewChildMessage>( new AddNewChildMessage() );

添加子项是一个示例 - 您可以添加任何所需的逻辑。