谁在S​​ilverlight MVVM中设置了DataContext

9 silverlight mvvm

我一直在阅读来自MSDN等各种来源的MVVM模式:

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

在那篇文章中它说:与MVP中的Presenter不同,ViewModel不需要对视图的引用.

如果View(XAML)假定它的DataContext是ViewModel,那么代码中的位置是以下行:

view.DataContext = viewModel;
Run Code Online (Sandbox Code Playgroud)

ViewModel对视图一无所知,因此无法设置datacontext.如果我给ViewModel提供参考,我是否打破了MVVM模式?我的另一个选择是拥有某种类型的Builder或额外的Presenter,其唯一的工作就是连接整个事物(等待View的加载事件,设置DataContext).

我知道不同的视图可以共享相同的DataContext(例如,仅为主窗口设置DataContext,而其他人将看到它),但在许多情况下,这根本不可能,甚至不可行.

Jer*_*ill 6

这个问题很多,有很多答案.这一切都取决于您希望如何构建您的应用程序.例如,我使用依赖注入来创建我的IViewModel,然后创建我的IView,我的IViewModel在构造函数上运行IView.SetViewModel(this).

其他人可能希望通过在Xaml中设置DataContext来使用更多Blendable方法:

<UserControl.DataContext>
    <ns:CrazyViewModel />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)

有时可以隐含DataContext,因此它由框架设置,就像ItemsControl使用的DataTemplate实例一样.这在桌面WPF中也很常见,因为它支持类型化的DataTemplates.

因此,设置DataContext确实没有错误的方法,只要您分离关注点,可维护且易于测试.


Jam*_*add 3

Shawn Wildermuth 有一篇关于 View 还是 ViewModel 优先的文章: http://wildermuth.com/2009/05/22/Which_came_first_the_View_or_the_Model

我喜欢并使用他的婚姻概念,其中第三方类创建视图和视图模型,然后将两者关联起来。这对我来说效果很好。