我在这里简化了一点:
我有一个标签控件,并希望各个标签能够创建更多标签;兄弟姐妹,如果你愿意的话。所以我调用了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意义上)实现这一点的方式,以及如何这是最好的。谢谢!
答案 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() );
添加子项是一个示例 - 您可以添加任何所需的逻辑。