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