C# 视图模型进入视图
目前我正在和WPF一起学习C#。我的主要方法是尽我所能使用MVVM模式,但现在我有点困惑 在我所有视图的应用程序中,我有一个viewmodel:C# 视图模型进入视图,c#,wpf,mvvm,C#,Wpf,Mvvm,目前我正在和WPF一起学习C#。我的主要方法是尽我所能使用MVVM模式,但现在我有点困惑 在我所有视图的应用程序中,我有一个viewmodel: private DruckviewViewModel ViewModel { get; set; } public Druckview() { ViewModel = new DruckviewViewModel(); DataContext = ViewModel; InitializeComponent(); } 这是将
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值得一提的是。视图不需要知道特定的视图模型。它们只需要知道基本的“形状”。您可以拥有一个可以与许多不同类型的视图模型一起工作的视图,即使这些视图模型没有共享祖先。但是,如果您将视图上的属性声明为特定的具体类型,您就无法做到这一点。