MVVM - View 是否应该引用 Presenter/ViewModel?

标签 mvvm prism mvp

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

在过去,我以相反的方式做到了这一点,我将演示者注入(inject)到 View 中,以便 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();
    }
}

上面的技术对我来说似乎足够合理,但是看着样本我开始质疑这种方法。有没有人对解决这个问题的最佳方式有看法(没有双关语)?
  • 将演示者添加到 View 中并让 View 与演示者交互
  • 将 View 添加到演示者并让演示者与 View 交互
  • 我还没有想到的完全不同的东西?
  • 最佳答案

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

    <DataTemplate DataType="{x:Type vm:SomeViewModel}">
        <v:SomeView />
    </DataTemplate>
    

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

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

    关于MVVM - View 是否应该引用 Presenter/ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431758/

    相关文章:

    architecture - 在 ExtJs 中分离 Controller 和 View

    java - MVP 中 View 和 Presenter 之间的通信模式是什么?

    asp.net-mvc-3 - 如何在 MVC 3 Razor 中使用 knockout.js?

    c# - 如何将 Observable Collection 的 Item 属性绑定(bind)到 Switch 状态?

    wpf - Prism中的MVVM多个 View 相同的ViewModel

    c# - 如何使 ViewModel 从 View 中使用的组件调用方法 - WPF Prism

    wpf - 将模型的单个实例传递给同一模块中的多个 View 模型以获取不同的 View

    c# - 异常和模型 View 呈现器 (C#)

    c# - 当我在 WPF Mvvm 中按下按钮时,如何在 DataGrid 中显示数据?

    wpf - WPF如何在MVVM中执行从主ViewModel到子ViewModel的命令