WPF编程方法论




entity-framework mvvm (3)

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

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

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


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

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

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

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

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

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

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


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>

代码背后:

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目前也正在应用于其他技术(目前有很多关于网络MVVM的讨论,有JavaScript和类似的东西)

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


我肯定会使用像Unity这样的框架来研究DependencyInjection

您的Singleton类可以使用DependencyInjection容器注册并注入其他类的构造函数(例如ViewModels)。 其他DAL类也需要定期实例化并注入类中。

DependencyInjection是开发大型企业软件应用程序时最重要的设计模式,适用于客户端和服务器代码。 MVVM是一个很好的模式,但不会解决与依赖性耦合相关的整体应用程序复杂性问题。







.net-4.5