Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确处理MVVM父级中的子级引发的事件_C#_Wpf_Mvvm - Fatal编程技术网

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

C# 正确处理MVVM父级中的子级引发的事件,c#,wpf,mvvm,C#,Wpf,Mvvm,我在这里简化了一点: 我有一个选项卡控件,希望单个选项卡能够创建更多选项卡;兄弟姐妹,如果你愿意的话。因此,我将选项卡控件称为父控件,其选项卡页面称为子控件 使用MVVM,我的选项卡控件视图模型如下所示: class ParentViewModel { ObservableCollection<ChildViewModel> _pages; public ObservableCollection<ChildViewModel> Pages {

我在这里简化了一点:

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

使用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
{
可观察的收集页面;
公共可观察收集页面
{
得到
{
如果(_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“正确”的方法。