我一直在查看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)
上面的技术对我来说似乎足够合理,但看着样本我开始质疑这种方法.最好的方法是否有人有意见(没有双关语)?
将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的实际类型,这会导致耦合)