ViewModel进入视图

时间:2016-09-08 17:03:22

标签: c# wpf mvvm

目前我正在使用WPF学习C#。我的mainapproach是尽我所能使用MVVM模式,但现在我有点困惑。

在我的所有观点的应用程序中,我有一个viewmodel:

private DruckviewViewModel ViewModel { get; set; }

public Druckview()
{
    ViewModel = new DruckviewViewModel();
    DataContext = ViewModel;
    InitializeComponent();
}

这是将ViewModel实现到View中的建议方法还是有更好的方法来实现它?

2 个答案:

答案 0 :(得分:1)

这将有效,但它对MVVM模式并不真实,因为View现在直接与视图模型绑定。

大多数现有的MVVM框架都使用View Manager的概念。从视图模型实例创建视图的类,将它们连接在一起,并显示视图。你最终会得到这样的东西:

DruckviewViewModel vm = new DruckviewViewModel()
ViewManager.Instance.DisplayViewFor(vm);

根据命名约定,{I} DruckviewViewModel会使用Druckview。它将创建视图,设置DataContextProperty,并使视图可见。

如果不使用其中一个框架,这需要自己构建很多工作,但这被认为是最佳实践"图案。

您可能需要考虑使用现有框架,可以找到比较其功能的良好列表here

BTW,如果你想知道如何在XAML设计器中获取intellisense而不在视图的构造函数中设置DataContext。正确的方法是在XAML中添加一个设计实例,其中包含这样的属性。

d:DataContext="{d:DesignInstance local:DruckviewViewModel}"

答案 1 :(得分:1)

MVVM并不意味着没有代码隐藏。

MVVM是关注点分离的模式。它有助于将应用程序的体系结构分为三个部分(按照外观顺序):
    Model
    View
    ViewModel

Model是包含业务逻辑的类。

View代表您的视图类,其中仅包含与视图相关的逻辑(XAMLcode-behind)除非代码仅包含视图的逻辑,否则可以使用代码隐藏( 例如在按钮点击事件处理程序中,您将一个文本框的颜色复制到另一个文本框,这当然可以在XAML中完成,但从MVVM的角度来看它并不重要

ViewModel代表了View的行为,没有引用View 请注意,例如,我认为此属性将违反MVVM模式,因为Visibility是视图相关类型

public Visibility MyVisibility { get; set; }

因此MVVM部分之间的依赖关系如下:

Model并不知道任何事情 ViewModel只知道Model View了解ViewModel

查看---> ViewModel --->模型

我认为使用MVVM并不重要ViewViewModel的紧密联系。它已经有限,因为您使用ViewModel的属性和命令。

没有紧密绑定(例如使用接口作为ViewModel),您可以通过创建自己的"设计时间"来测试View而不是真正的ViewModel。例如,viewmodels。

如果您当前的解决方案有效且满足您的需求,那么您只需从MVVMWPF开始,然后继续,直到您遇到需要将ViewViewModel完全隔离开来的类型