3

我在这里稍微简化一下:

我有一个选项卡控件,并且希望单个选项卡能够创建更多选项卡;兄弟姐妹,如果你愿意的话。所以我称选项卡控件为父控件,其选项卡为子控件。

使用 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 上按下按钮(例如)以导致将另一个 ChildViewModel 添加到 ParentViewModel 对象的集合中。

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

4

2 回答 2

3

我喜欢处理这种情况的一种方法是使用事件聚合。

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

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

这样做的好处是孩子们不知道谁在听,而父母只知道它有一个事件请求要处理。欲了解更多信息,你可以去这里!

于 2012-08-21T15:06:56.347 回答
0

您可以使用MVVM LiteMessenger(或自己编写):

并从子类向父类发送消息。请参阅此处的示例。

创建一个消息类:

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() );

添加孩子就是一个例子——你可以添加任何你想要的逻辑。

于 2012-08-21T15:21:10.103 回答