C# 正确处理MVVM父级中的子级引发的事件
我在这里简化了一点: 我有一个选项卡控件,希望单个选项卡能够创建更多选项卡;兄弟姐妹,如果你愿意的话。因此,我将选项卡控件称为父控件,其选项卡页面称为子控件 使用MVVM,我的选项卡控件视图模型如下所示:C# 正确处理MVVM父级中的子级引发的事件,c#,wpf,mvvm,C#,Wpf,Mvvm,我在这里简化了一点: 我有一个选项卡控件,希望单个选项卡能够创建更多选项卡;兄弟姐妹,如果你愿意的话。因此,我将选项卡控件称为父控件,其选项卡页面称为子控件 使用MVVM,我的选项卡控件视图模型如下所示: class ParentViewModel { ObservableCollection<ChildViewModel> _pages; public ObservableCollection<ChildViewModel> Pages {
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
{
可观察的收集页面;
公共可观察收集页面
{
得到
{
如果(_pages==null)
_pages=新的ObservableCollection();
返回页面;
}
}
公共ParentViewModel()
{
添加(新的ChildViewModel());
}
}
因此,我在ParentViewModel上有一组ChildViewModel对象
这是一种享受,从ParentViewModel内部,我当然可以轻松地将所有额外的ChildViewModel对象添加到我的集合中,并将其很好地反映在我的视图中
我想做的是允许在ChildView上按一个按钮(例如),从而将另一个ChildViewModel添加到ParentViewModel对象的集合中
我已经读了很多关于中继命令、路由命令、相对资源绑定、依赖注入模式等的书,但是有人能告诉我实现这一点的“正确”(在MVVM意义上)方法,以及它的最佳实现方式吗。谢谢大家! 我喜欢处理这种情况的方法之一是使用事件聚合 这是一个添加了团结的能力(如果你还没有使用) 基本上,您将事件聚合器添加到依赖注入中,然后您的家长将作为事件的侦听器订阅,您的孩子将发布该事件 有趣的是,孩子们不知道谁在听,家长只知道要处理一个事件请求。有关更多信息,您可以转到您可以使用e
Messenger
类(或编写您自己的):
并从childe类向父类发送消息。请看一个例子
创建消息类:
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.Register
(
这
(消息)=>AddNewChild(消息)
);
私有void AddNewChild(AddNewChildMessage消息)
{
//对消息进行staf。如果有数据
添加(新的ChildViewModel());
}
在子视图模型中:
Messenger.Default.Send<AddNewChildMessage>( new AddNewChildMessage() );
Messenger.Default.Send(newaddnewchildmessage());
添加childs就是一个例子-您可以添加任何您想要的逻辑。在创建子视图模型时,将引用传递给父视图?这对我来说很有意义,而且似乎是最简单的方法;然而,它似乎不能很好地扩展(例如,如果有多个级别可以冒泡),并且可以从事件冒泡等方面进行选择,我渴望得到mvvm“正确”的方法。