WPF编程方法论

Sig*_*ega 63 wpf entity-framework mvvm .net-4.5

在WPF编程我的APP 3个月后,我第二次想到了我编写应用程序的方式(我知道这可能为时已晚).在我的APP上,我使用的是我的工具管理的软件的API.我的DAL包含16个类,其中3个是单例.我在.cs文件中有一些逻辑,而且XAML偏离正轨.我的问题是,我看到很多评论认为用WPF编写的应用程序应该使用MVVM,这将使代码更具可用性和可读性,我可以将我的代码转换为MVVM吗?什么是MVVM的实际含义(不是维基百科或手册定义)?

我也使用SQL查询,我读了一篇关于EF(实体框架)的论文,MVVM和EF可以在同一个项目中共存吗?

我知道我的问题是一个新手问题(我是新手:P)和一个抽象的问题,但我想知道我写的应用程序将是我此时写的最好的:)

Fed*_*gui 119

MVVM的实际含义是:UI不是数据.数据是数据,UI是UI.

这意味着您不应该以程序逻辑(通常称为业务逻辑)紧密耦合或依赖于UI组件状态的方式开发应用程序,而是使其依赖于数据项的状态(无论是模型,或视图模型).

例如,在其他框架(例如winforms)中,如果您的屏幕包含文本框和按钮,则通常会向按钮添加单击事件处理程序,然后从文本框中读取文本.在MVVM中,TextBox的Text属性应绑定到ViewModel中的字符串属性,并且该按钮也应绑定到ViewModel中的Command.

这允许抽象UI(这是ViewModel),因此,正如我之前所说,您的应用程序逻辑可以不依赖于UI而是依赖于它的抽象.

这允许UI和逻辑中的大量可伸缩性,并且还允许UI行为的若干方面的可测试性,因为在ViewModel中定义了大部分UI行为.

MVVM还有其他方面,但主要的实现是.

编辑:

为了完整答案,我将添加一个具体的例子:

1 - 非MVVM WPF:

XAML:

<StackPanel>
   <TextBox x:Name="txtLastName"/>
   <Button Content="Click Me" Click="Button_Click"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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
}
Run Code Online (Sandbox Code Playgroud)

2 - MVVM WPF:

XAML:

<StackPanel>
   <StackPanel.DataContext>
       <my:MyViewModel/>
   </StackPanel.DataContext>
   <TextBox Text="{Binding LastName}"/>
   <Button Content="Click Me" Command="{Binding MyCommand}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

视图模型:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面的示例中所看到的,ViewModel根本不包含对View的引用.因此,视图可以是任何东西,只要{Bindings}它们保持在原位.

神奇地使它们协同工作的DataContext粘合剂是WPF UI元素的属性,它是将解析所有绑定的对象.

还有其他一些东西,例如ViewModel中的属性更改通知,可以启用双向绑定,但这超出了本答案的范围.

还要记住,MVVM是一种设计模式,而WPF是一种框架.MVVM目前也正在应用于其他技术(目前有很多关于网络MVVM的讨论,有JavaScript和类似的东西)

我建议你阅读其他答案中提到的书籍以及本教程,了解更多WPF特定方面.


Big*_*ddy 15

我的问题是,我看到很多评论认为用WPF编写的应用程序应该使用MVVM,这将使代码更具可用性和可读性,我可以将我的代码转换为MVVM吗?

您无需使用MVVM模式 - 无.您需要考虑正在构建的应用程序的复杂性以及开发组技能集.一般来说,如果它是一个小型或小型/中型应用程序,那么MVVM 可能会过度工程化.如果小组的技能/才能不适合分离的演示模式,那么MVVM可能不是一个好的决定.

如果做得好,那么MVVM会为您提供您所了解的各种好处.相反,如果它做错了,那么它可能是一个开发和维护的噩梦 - 绝对不是更具可读性和可用性.从个人经验来看,我认为使用编写糟糕的代码隐藏应用程序而不是基于MVVM编写得不好的应用程序更容易.

当然,您可以将当前应用程序重写为MVVM模式.只需删除你的代码隐藏并将其放入你的视图模型,辅助类,存储库类,商业逻辑类等等.不要陷入将所有内容放入视图模型的过程中,创建一个MVVM荣耀的代码-背后.

我也使用SQL查询,我读了一篇关于EF(实体框架)的论文,MVVM和EF可以在同一个项目中一起使用吗?

当然,他们可以.请记住,EF是一种数据访问技术,MVVM是一种设计模式.你可能会在你提到的DAL课程中使用EF.

最后一个想法,如果你决定沿着MVVM路线走,那么你应该考虑使用一个方便它的框架,比如Prism.哦,并为相当多的学习和挫折做好准备.