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

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

    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();
    }
}

上面的技术对我来说似乎足够合理,但查看示例后我开始质疑这种方法。有没有人对解决这个问题的最佳方法有意见(没有双关语)?

  • 将演示者添加到视图中并让视图与演示者交互
  • 将视图添加到演示者并让演示者与视图交互
  • 有什么完全不同的东西是我还没想到的吗?
有帮助吗?

解决方案

我认为这都是品味问题。就我个人而言,我喜欢您在正在查看的示例中看到的方式。IView 有一种方法,那就是 SetViewModel(...)。IViewModel 有一个称为 Object 类型的 View 的属性,它本质上返回 DI 实例化的 IView。

我喜欢这种方式的原因是我几乎总是想先创建一个 ViewModel 并且我想要 没有人 在代码中能够对我的 IView 执行任何操作,除了获取对实例的引用(用于视图注入或将视图绑定到 ContentControl),这就是它的类型对象的原因。如果任何代码需要与视图通信,对我来说,它总是通过虚拟机......即使如此,视图通常也会通过绑定进行更新。从 View->ViewModel->UpdateBinding->View 会感觉很奇怪,而不是 VM->UpdateBinding->View

为了回答这个问题,我通常不需要在代码隐藏中引用演示者。通常我可以使用绑定到虚拟机的视图中的命令来处理该问题。在某些情况下,您可能希望保留对演示者的引用来执行示例中的操作,但如果使用正确的工具集,这是可以避免的(由于没有内置命令,SL 变得更困难)。

就像我说的,这都是品味问题......

-杰尔

其他提示

在 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,您可以随时强制转换 DataContext (但这意味着 View 知道 ViewModel 的实际类型,这会导致耦合)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top