C# 视图模型进入视图

C# 视图模型进入视图,c#,wpf,mvvm,C#,Wpf,Mvvm,目前我正在和WPF一起学习C#。我的主要方法是尽我所能使用MVVM模式,但现在我有点困惑 在我所有视图的应用程序中,我有一个viewmodel: private DruckviewViewModel ViewModel { get; set; } public Druckview() { ViewModel = new DruckviewViewModel(); DataContext = ViewModel; InitializeComponent(); } 这是将

目前我正在和WPF一起学习C#。我的主要方法是尽我所能使用MVVM模式,但现在我有点困惑

在我所有视图的应用程序中,我有一个viewmodel:

private DruckviewViewModel ViewModel { get; set; }

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

这是将ViewModel实现到视图中的建议方法还是有更好的方法?

这会起作用,但MVVM模式并非如此,因为视图现在直接绑定到视图模型

大多数现有的MVVM框架都使用视图管理器的概念。从视图模型实例创建视图、将它们连接在一起并显示视图的类。你会得到这样的结果:

DruckviewViewModel vm = new DruckviewViewModel()
ViewManager.Instance.DisplayViewFor(vm);
根据命名约定,它会发现
druckviewmodel
使用
Druckview
。它将创建视图,设置DataContextProperty,并使视图可见

如果不使用这些框架中的任何一个,您需要自己构建大量的工作,但这被认为是一种“最佳实践”模式

您可能想考虑使用现有的框架,可以找到一个比较它们的特性的好的列表。


顺便说一句,如果您想知道如何在XAML设计器中获得intellisense,而不必在视图的构造函数中设置DataContext。正确的方法是在XAML中添加一个具有如下属性的设计实例

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

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

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

查看

ViewModel

其中
Model
是包含业务逻辑的类

View
表示只包含视图相关逻辑(
XAML
code-behind
)的视图类,除非代码只包含视图的逻辑,否则可以使用代码behind(例如,在button click eventhandler中,您可以将一个文本框的颜色复制到另一个文本框,这当然可以在
XAML
中完成,但从
MVVM
的角度来看,这并不重要)

ViewModel
表示视图的行为,而不引用
视图

请注意,例如,我认为这个属性将违反
MVVM
模式,因为
Visibility
是与视图相关的类型

public Visibility MyVisibility { get; set; }
因此,
MVVM
各部分之间的依赖关系如下:

DruckviewViewModel vm = new DruckviewViewModel()
ViewManager.Instance.DisplayViewFor(vm);
Model
什么都不知道
ViewModel
仅了解
Model

View
了解
ViewModel

视图-->视图模型-->模型

我认为使用
MVVM
ViewModel
绑定的紧密程度并不重要。它已经绑定了,因为您使用了
ViewModel
的属性和命令

不紧密绑定(例如使用界面作为
ViewModel
)将使您可以通过创建自己的“设计时”视图模型来测试视图,而不使用真实的
ViewModel


如果您当前的解决方案能够工作并满足您的需求,而您只是从
MVVM
WPF
开始,然后继续这样做,直到您满足将
View
ViewModel
的类型完全隔离开来的需求为止。这种方式是否如您所愿?请随时到WPF聊天室来。我们提供MVVM。@Fabio是的,它是w工作很好。但在每个网站上都有“零代码落后”的说法,所以我想一定有另一种方法MVVM!=没有代码隐藏。你这里的代码有一股浓烈的气味。看起来你把UI代码放在了专门为用户控件设计的视图模型中。用户控件可以为视图模型设计,也可以为模型设计,但不能反过来。想想看——TextBox有TextBoxViewModel吗?不。这样做会破坏绑定的工作方式。DataContext不是你的模型/视图模型,所以
@F.Baum:这叫做视图优先,很糟糕。谢谢你的好解释!我想我会用一些框架来实现这一点。我是一家软件公司的实习生,每次我必须写一些代码时,我的老板都会说‘嘿,想想看关于MVVM模式,因为我的codebehind。我认为
View
ViewModel
绑定的紧密程度与
MVVM
模式无关,因为
View
至少在运行时需要了解
ViewModel
。当然,解除此连接将在设计View和u值得一提的是。视图不需要知道特定的视图模型。它们只需要知道基本的“形状”。您可以拥有一个可以与许多不同类型的视图模型一起工作的视图,即使这些视图模型没有共享祖先。但是,如果您将视图上的属性声明为特定的具体类型,您就无法做到这一点。