C# 在WPF MVVM中通知ViewModels用户控制事件时的正确方法?

C# 在WPF MVVM中通知ViewModels用户控制事件时的正确方法?,c#,wpf,mvvm,C#,Wpf,Mvvm,在我的WPF视图中,我将数据加载到用户控件中,如下所示: <ContentControl Content="{Binding ItemEditVm}" /> 我有一系列的数据模板来说明哪个视图属于哪个ViewModel。然后在我的业务逻辑中,我可以为UserControl创建一个新的ViewModel,然后将其分配给属性,所有工作都按照预期进行 但是,要解决此应用程序中的下一个任务,我需要能够将UserControl内部发生的事件通知父ViewModel。我在我的子视图模型上使用

在我的WPF视图中,我将数据加载到用户控件中,如下所示:

<ContentControl Content="{Binding ItemEditVm}"  />
我有一系列的数据模板来说明哪个视图属于哪个ViewModel。然后在我的业务逻辑中,我可以为UserControl创建一个新的ViewModel,然后将其分配给属性,所有工作都按照预期进行

但是,要解决此应用程序中的下一个任务,我需要能够将UserControl内部发生的事件通知父ViewModel。我在我的子视图模型上使用了一个简单事件,在父视图模型上使用了一个侦听器:

public event EventHandler ItemEditViewModelChanged();
因此,当我创建ViewModel时,我可以添加一个侦听器:

ItemEditViewModel vm = new ItemEditViewModel(itemId);
vm.ItemEditViewModelChanged += vm_ItemEditViewModelChanged;
并在vm_ItemEditViewModelChanged()中执行需要执行的操作

然而,我本能地对此感到不舒服。虽然它没有直接违反任何MVVM原则(事情仍然是可测试的,视图和ViewModels仍然是分开的),但它似乎不是一种非常灵活的方式,而且它确实在ViewModel类之间创建了不需要的逻辑链接


有更好的方法吗?我创建UserControls并将其加载到ContentControls中的方法是否是创建子控件的糟糕方法?还是我什么都不担心?

我不确定这是否对你有用,只是我的想法


如果您有一个
MainViewModel
可以容纳所有其他
ViewModel
的视图模型,如上图所示,那么您可以公开
Properties/Methods
来调用MainViewModel,让
MainViewModel
决定与不同的
ViewModel

我个人更喜欢实现这样的功能使用依赖注入。通常需要发出多个通知,因此首先声明一个接口:

public interface ICustomEventHandler
{
    void Event1();
    void Event2();
    // .. etc
}
然后在子vm中,使用依赖项注入来注入任何需要监视的对象:

public class ChildVM
{
    [Inject] public ICustomEventHandler Watcher {get; set;}

    // .. etc ..
}

首先,这使得模拟非常容易,因此您的单元测试也包括在内,但更重要的是,您已经正式确定了此模块与其余代码之间的依赖关系,并且还保留了如何最好地实现它的选项。(一个简单的解决方案是让父级直接实现该接口,并在创建时将其自身注入子级,在另一种情况下,您可能需要使用具有单例作用域或多个客户端的中间类).

您的
内容控件是否放置在视图中?是否有
视图模型?您是否尝试过使用消息或事件聚合器?@AbinMathew是的,有。这就是我要提出的事件。@LawrenceA.conterras不,只是标准事件。
public class ChildVM
{
    [Inject] public ICustomEventHandler Watcher {get; set;}

    // .. etc ..
}