在我的应用程序中,我使用的是我的工具管理的软件的API。我的DAL包含16个类,其中3个是单例类。我在.cs文件中有一些逻辑,XAML偏离了路线。
我的问题是,我看到很多评论,用WPF编写的应用程序应该使用MVVM,这将使代码更易用和可读性,我可以将我的代码转换为MVVM吗?MVVM的实际含义是什么(不是Wikipedia或手动定义)?
我也使用SQL查询,我读了一篇关于EF (实体框架)的论文,MVVM和EF可以在同一个项目中共存吗?
发布于 2013-01-17 23:13:37
MVVM的实际含义是:UI不是数据。数据就是数据,UI就是UI。
这意味着您不应以程序逻辑(通常称为业务逻辑)紧密耦合或依赖于UI组件的状态的方式开发应用程序,而应使其依赖于数据项的状态(无论是模型还是视图模型)。
例如,在其他框架(如winforms)中,如果您的屏幕包含一个textbox和一个按钮,则通常会向按钮添加一个click事件处理程序,然后从textbox中读取文本。在MVVM中,TextBox的Text属性应该绑定到ViewModel中的string属性,按钮也应该绑定到ViewModel中的Command。
这允许对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>ViewModel:
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根本不包含对视图的引用。因此,视图可以是任何东西,只要{Bindings}保持在适当的位置。
神奇地使它们协同工作的粘合剂是WPF元素的DataContext属性,它是所有绑定都将被解析的对象。
还有其他东西,如ViewModel中的属性更改通知,以启用双向绑定,但这超出了本答案的范围。
还要记住,MVVM是一个设计模式,而WPF是一个框架。MVVM目前也被应用在其他技术中(目前有很多关于web的MVVM的议论,比如JavaScript之类的)
我建议您阅读其他答案中提到的书籍以及this Tutorial,以了解更多特定于WPF的方面。
发布于 2013-01-17 23:18:11
我的问题是,我看到很多评论说用WPF编写的应用程序应该使用MVVM,这将使代码更易用和可读性,我能把我的代码转换成MVVM吗?
没有必要使用MVVM模式-- none。您需要考虑正在构建的应用程序的复杂性和开发团队的技能集。一般来说,如果它是一个小型或小型/中型应用程序,那么MVVM可能是过度工程。如果团队的技能/天赋不适合单独的表示模式,那么MVVM可能不是一个好的决定。
如果操作得当,MVVM会给你带来你读过的所有好处。相反,如果它做错了,那么它可能是开发和维护的噩梦-肯定不是更好的可读性和可用性。从个人经验来看,我认为在一个写得不好的代码隐藏应用上工作要比在一个写得不好的基于MVVM的应用上更容易。
当然,您可以将当前的应用程序重写为MVVM模式。只需移除代码隐藏并将其放入视图模型、助手类、存储库类、业务逻辑类等。不要陷入将所有内容都放入视图模型中的陷阱,从而创建MVVM美化的代码隐藏。
我也使用SQL查询,我读了一篇关于EF (实体框架)的论文,
和EF可以在同一个项目中一起离开吗?
当然,他们可以。请记住,EF是一种数据访问技术,而MVVM是一种设计模式。您可能会在您提到的DAL类中使用EF。
最后一个想法是,如果你决定沿着MVVM的路线走下去,那么你应该考虑使用一个促进它的框架,比如Prism。哦,准备好接受相当多的学习和挫折吧。
发布于 2013-11-14 21:24:50
我肯定会使用像Unity这样的框架来研究DependencyInjection。
您的单例类可以注册到DependencyInjection容器并注入到其他类(如ViewModels)的构造函数中。需要定期实例化并注入到类中的其他DAL类也是如此。
在开发大型企业软件应用程序时,DependencyInjection是最重要的设计模式,适用于客户端和服务器代码。MVVM是一个很好的模式,但不能解决与依赖耦合相关的整体应用程序复杂性问题。
https://stackoverflow.com/questions/14381402
复制相似问题