在我的APP中,我使用了我工具正在管理的软件的API。我有一个包含16个类的DAL,其中3个是单例模式。我在.cs
文件和XAML
中有一些逻辑。
我的问题是,我看到很多评论说用WPF编写的应用程序应该使用MVVM,这将使代码更可用和可读。我能否将我的代码转换为MVVM?MVVM的实际含义是什么(不是维基百科或手册定义)?
我还使用SQL查询,并阅读了一篇关于EF(Entity Framework)的论文。MVVM和EF是否可以在同一个项目中共存?
在我的APP中,我使用了我工具正在管理的软件的API。我有一个包含16个类的DAL,其中3个是单例模式。我在.cs
文件和XAML
中有一些逻辑。
我的问题是,我看到很多评论说用WPF编写的应用程序应该使用MVVM,这将使代码更可用和可读。我能否将我的代码转换为MVVM?MVVM的实际含义是什么(不是维基百科或手册定义)?
我还使用SQL查询,并阅读了一篇关于EF(Entity Framework)的论文。MVVM和EF是否可以在同一个项目中共存?
MVVM的实际含义是:UI不是数据。数据是数据,UI是UI。
这意味着您不应该以程序逻辑(通常称为业务逻辑)与UI组件的状态紧密耦合或依赖的方式开发应用程序,而应该使其依赖于数据项的状态(无论是模型还是视图模型)。
例如,在其他框架(如winforms)中,如果您有一个包含文本框和按钮的屏幕,通常会向按钮添加单击事件处理程序,然后从文本框读取文本。在MVVM中,TextBox的Text属性应绑定到ViewModel中的字符串属性,按钮也应绑定到ViewModel中的命令。
这允许UI的抽象(即ViewModel),因此,正如我之前所说,您的应用程序逻辑可以依赖于UI的抽象,而不是UI本身。
这允许UI和逻辑具有巨大的可伸缩性,并且还允许测试UI行为的多个方面,因为UI行为的很大一部分是在ViewModel中定义的。
还有其他方面的MVVM,但主要认识是:
编辑:
为了完整起见,我将添加一个具体的示例:
1 - 非MVVM WPF:
XAML:
<StackPanel>
<TextBox x:Name="txtLastName"/>
<Button Content="Click Me" Click="Button_Click"/>
</StackPanel>
后台代码:
private void Button_Click(object sender, EventArgs e)
{
//Assuming this is the code behind the window that contains the above XAML.
var lastname = this.txtLastName.Text;
//Here you do some actions with the data obtained from the textbox
}
2 - MVVM WPF:
XAML:
<StackPanel>
<StackPanel.DataContext>
<my:MyViewModel/>
</StackPanel.DataContext>
<TextBox Text="{Binding LastName}"/>
<Button Content="Click Me" Command="{Binding MyCommand}"/>
</StackPanel>
视图模型:
public class MyViewModel
{
public string LastName { get; set; }
public Command MyCommand { get; set; }
public MyViewModel()
{
// The command receives an action on the constructor,
// which is the action to execute when the command is invoked.
MyCommand = new Command(ExecuteMyCommand);
}
private void ExecuteMyCommand()
{
//Only for illustration purposes, not really needed.
var lastname = this.LastName;
//Here you do some actions with the data obtained from the textbox
}
}
从上面的例子中可以看出,ViewModel根本没有与View有任何关联,因此只要保持Bindings不变,View可以是任何东西。
使它们神奇地协同工作的粘合剂是WPF UI元素的DataContext属性,它是所有绑定将被解析为的对象。
还有其他一些东西,例如在ViewModel中启用双向绑定的属性更改通知,但这超出了本答案的范围。
还要记住,MVVM是一种设计模式,而WPF是一个框架。MVVM目前也应用在其他技术中(目前关于JavaScript等网络技术的MVVM有很多热议)。
我建议您阅读其他答案中提到的书籍以及这个教程,以了解更多关于WPF的特定方面。
这些是与MVVM相关的特定内容
1)增加了视图的“可混合性”(使用Expression Blend设计视图的能力)。这使得团队中拥有设计师和程序员的幸运者可以分别独立工作,实现责任的分离。
2)“无外观”视图逻辑。视图与其后台运行的代码无关,使得相同的视图逻辑可以在多个视图之间重复使用,或者可以轻松地重新调整或替换视图。将“行为”和“样式”分开处理。
3)没有重复的代码来更新视图。在代码后台中,你会看到到处都是“myLabel.Text = newValue”等调用。使用MVVM,只需设置底层属性及其所有视图副作用,就可以确保视图得到适当的更新。
4)可测试性。由于你的逻辑完全不涉及视图(没有“myLabel.Text”引用),因此单元测试变得非常容易。你可以测试ViewModel的行为,而不涉及其视图。这也使得使用代码后台几乎不可能进行视图行为驱动开发成为可能。
其他两种模式实际上是解决不同问题的。你可以将MVVM与MVP和MVC一起使用(大多数好的示例都会以某种形式这样做)。
实际上,在我看来,MVP(带有被动视图而不是监督控制器)只是MVVM的一个变体。