我一直在查看 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();
}
}
上面的技术对我来说似乎足够合理,但是看着样本我开始质疑这种方法。有没有人对解决这个问题的最佳方式有看法(没有双关语)?
最佳答案
在 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/