MVVM - View应该引用Presenter/ViewModel吗?

Ste*_*eve 0 mvp prism mvvm

我一直在查看PRISM 2样本,了解如何最好地处理我正在开发的新应用程序,这将是一个PRISM 2/WPF应用程序.特别关注PRISM附带的View Injection示例应用程序我注意到所有视图都实现了一个接口,允许演示者(或ViewModel)与View进行交互.

在过去,我已经完成了相反的方式,我将演示者注入到视图中,以便视图可以直接调用演示者上的方法,如下所示:

    public partial class SomeView : ModuleBase
    {

        private ISomePresenter _somePresenter;

        public SomeView (ISomePresenter somePresenter):this()
        {
            // Give the view a reference to the presenter
            _somePresenter = somePresenter;
            // Bind the View to the presenter
            DataContext = _somePresenter;
        }

    private void btnSubmit_Click(object sender, RoutedEventArgs e)
    {
        // The view can call actions directly on the presenter (OK I should probably use a command for this)
        _somePresenter.SomeAction();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的技术对我来说似乎足够合理,但看着样本我开始质疑这种方法.最好的方法是否有人有意见(没有双关语)?

  • 将演示者添加到视图并获取视图以与演示者交互
  • 将视图添加到演示者并让演示者与视图进行交互
  • 我还没有想到的完全不同的东西?

Tho*_*que 5

将ViewModel映射到MVVM中的View的最常用方法是使用DataTemplate:

<DataTemplate DataType="{x:Type vm:SomeViewModel}">
    <v:SomeView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

当您在ContentControl或ItemsControl中显示ViewModel实例时,WPF将自动为ViewModel实例化相应的View,并将View设置DataContext为ViewModel实例.

这样,您在ViewModel中没有对View的任何引用,View只通过该DataContext属性引用ViewModel .如果你真的需要在View的代码隐藏中访问ViewModel,你可以随时转换DataContext(但这意味着View知道ViewModel的实际类型,这会导致耦合)