WPF编程方法
在WPF上编写我的APP 3个月后,我再次想到了我编程我的应用程序的方式(我知道这可能太晚了)。 在我的APP上,我正在使用我的工具正在pipe理的软件的API。 我DAL包含16个类,其中3个是单身人士。 我在.cs
文件和XAML
的偏离过程中有一些逻辑。 我的问题是,我看到很多意见,用WPF编写的应用程序应该使用MVVM,这将使代码更加可用和可读,我可以将我的代码转换为MVVM吗? MVVM的实际含义是什么(不是维基百科或手动定义)?
我也使用SQL查询,我读了一篇关于EF(entity framework)的文章,MVVM和EF可以在同一个项目中共存吗?
我知道我的问题是一个有点新手的问题(我是新手:P)和一个抽象的问题,但我想知道,我会写的应用程序将是我可以在这个时候写的最好的:)
MVVM的实际含义是: UI不是数据。 数据是数据,UI是UI 。
这意味着您不应该以程序逻辑(通常称为业务逻辑)与UI组件的状态紧密耦合或依赖的方式来开发应用程序,而应使其依赖于数据项的状态(无论是模型,或查看模型)。
例如,在其他框架(如winforms)中,如果有一个包含文本框和一个button的屏幕,则通常会向该button添加一个单击事件处理程序,然后从文本框中读取文本。 在MVVM中,TextBox的Text属性应该绑定到ViewModel中的一个string属性,并且该button也应该绑定到ViewModel中的Command。
这允许UI(这是ViewModel)的抽象,所以,正如我之前所说,您的应用程序逻辑可以不依赖于UI而是依赖于它的抽象。
这允许UI和逻辑中的大量可伸缩性,并且还允许UI行为的几个方面的可testing性,因为在ViewModel中定义了大部分的UI行为。
还有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}
保留就位。
神奇地使它们一起工作的粘合剂是WPF UI元素的DataContext
属性,这是所有绑定将被parsing的对象。
还有其他的东西,比如ViewModel中的Property Change Notification来启用双向绑定,但这不在这个答案的范围之内。
另外请记住,MVVM是一种devise模式,而WPF是一个框架。 MVVM目前也正在应用于其他技术(目前有很多关于MVVM的热门话题,包括JavaScript和类似的东西)
我build议你阅读其他答案中提到的书以及本教程中更多的WPF特定方面。
我的问题是,我看到很多意见,用WPF编写的应用程序应该使用MVVM,这将使代码更加可用和可读,我可以将我的代码转换为MVVM吗?
没有要求您需要使用MVVM模式 – 没有。 您需要考虑您正在构build的应用程序的复杂性以及开发组技能集。 一般来说,如果它是一个小型或中小型应用程序,那么MVVM 可能是过度工程。 如果团队的技能/才能不适合独立的表示模式,那么MVVM可能不是一个好的决定。
如果做得对,那么MVVM为您提供了您所读过的所有好处。 相反,如果做错了,那么它可能是一个开发和维护的噩梦 – 绝对不是更可读和可用。 从个人经验来看,我认为在一个编写不好的代码隐藏应用程序上工作比在基于MVVM的应用程序编写工作要容易一些。
当然,您可以将您当前的应用程序重写为MVVM模式。 只要删除你的代码隐藏,并把它放到你的视图模型,帮助类,存储库类,biz逻辑类等。不要陷入把所有东西都放到你的视图模型,创build一个MVVM美化的代码-背后。
我也使用SQL查询,我读了一篇关于EF(entity framework)的文章,MVVM和EF可以在同一个项目中一起离开吗?
当然,他们可以。 请记住,EF是一种数据访问技术,MVVM是一种devise模式。 您可能会在您提到的DAL类中使用EF。
最后一个想法是,如果你决定走下MVVM路线,那么你应该考虑使用一个有利于它的框架,比如Prism
。 哦,并准备好了相当多的学习和挫折。
我肯定会研究DependencyInjection ,使用像Unity这样的框架。
你的Singleton类可以用DependencyInjection容器注册,并注入到其他类的构造函数(如ViewModels)中。 其他DAL类也需要定期实例化并注入类。
DependencyInjection是开发大型企业软件应用程序时最重要的devise模式,适用于Client&Server代码。 MVVM是一个很好的模式,但不会解决与依赖关系耦合相关的整体应用程序复杂性问题。
这些是我特有的MVVM
1)增加视图的“可混合性” (使用Expression Blenddevise视图的能力)。 这使得有足够幸运的devise师和程序员的团队的责任分离……每个人都可以独立工作。
2) “不看”的观点逻辑。 视图与运行在其后面的代码是不可知论的,使相同的视图逻辑可以在多个视图中重复使用,或者可以轻松地重组或replace视图。 分解“行为”与“风格”之间的关系。
3) 没有重复的代码来更新视图。 在代码隐藏中,你会看到很多调用“myLabel.Text = newValue”的地方。 使用MVVM,您可以放心,只需通过设置底层属性和所有视图的副作用来更新视图。
4) 可测性。 由于你的逻辑是完全不知道你的看法(没有“myLabel.Text”引用),unit testing是容易的。 您可以testingViewModel的行为而不涉及其视图。 这也启用了视图行为的testing驱动开发,使用代码隐藏几乎是不可能的。
其他两种模式在解决他们所关心的问题上确实是分开的。 你可以使用MVVM与MVP和MVC(最好的样本在那里做一些这样的forms)。
事实上,在我看来,MVP(具有被动视图,而不是监视控制器)实际上只是MVVM的一个变体。
- Catch-22防止通过WIF保证stream式TCP WCF服务的安全 毁了我的圣诞节,心理健康
- Microsoft.Bcl.Build NuGet包是做什么的?
- 并行运行两个asynchronous任务,并在.NET 4.5中收集结果
- asynchronous/等待与BackgroundWorker
- 为什么会find一个types的初始化器抛出一个NullReferenceException?
- 清洁的方式在C#中执行空检查?
- 为什么通用ICollection在.NET 4.5中实现IReadOnlyCollection?
- 如何在运行时检测到.NET 4.5版本正在运行您的代码?
- 使用.Net 4.5asynchronousfunction进行套接字编程