MVVM简介

MVVM,即Model-View-ViewModel。该设计模式的主要思路是:模型(Model)和视图(View)通过视图模型(View Model)进行交互,以此来剥离逻辑和界面之间的耦合。MVVM设计模式的应用目前就我所知只能建立在WPF技术之上,这是因为WPF提供了几种能够使MVVM成为可能的技术,比如数据绑定,下面将会提到。

使用该设计模式好处:

1. 提高代码的可复用性- 在产品升级换代的时候,我们的大部分逻辑代码仍将能继续使用,而不会因为用户界面的变化而需要修改逻辑的代码。

2. 提高代码可测试性 - 由于逻辑和界面不再有耦合,基本上可以为所有的代码写测试用例,大大提高代码质量。

3. 不再需要Code-Behind代码 - 通过WPF的特定技术,可以不再需要写Code-Behind代码,比如按钮的Click操作,以前的技术,我们需要在Code-Behind注册Click事件的处理函数,而WPF的绑定技术可以避免Code-Behind。

 

经过一段时间的学习和实践,下面对MVVM模式进行简单的总结,下面的代码使用C#语言实现。

-- 如果你不懂WPF,在阅读下面内容之前,建议你先了解WPF的概念

 

Model

即模型,可以理解为数据模型和商业逻辑,它完全不依赖于视图。

 

View

即视图或者界面。

 

ViewModel

即视图模型或者界面模型,View会直接访问ViewModel,这种访问可以使用WPF的数据绑定技术来达到。需要特别注意的是ViewModel不会也不应该去访问View,比如在ViewModel中获取一个按钮实例。有些时候我们需要控制View的状态,这种情况可以在ViewModel中设计合适的状态类型,然后和View中特定的控件进行绑定。

我们可以实现一个ViewModel 的抽象类来作为所有ViewModel的基类,代码如下:

public abstract class ViewModel : INotifyPropertyChanged

{

    public event PropertyChangedEventHandler PropertyChanged;

 

    protected void OnPropertyChanged(string propertyName)

    {

        if(PropertyChanged != null)

        {

              PropertyChagned(this, new PropertyChangedEventArgs(propertyName))

        }

    }

}

如果你不知道接口INotifyPropertyChanged用来干什么的,那就在网上搜索一下吧!

 

Model 和 ViewModel 之间的关系

一般情况下ViewModel会包含一个Model实例,然后通过自己的接口把Model的数据暴露出来让View来使用。 

public class Customer

{

     public string Name {get; set;}

}

 

public class CustomerViewModel : ViewModel

{

    public CustomerViewModel(Customer customer)

    {

         m_Customer = customer;

    }

 

    private Customer m_Customer;

    public string Name

    {

        get { return m_Customer.Name; }

        set

        {

            if(m_Customer.Name ! = value)

            {

                 m_Customer.Name = value;

                 OnPropertyChanged("Name");

             }

        }

    }

}

 

问题:如果Model中有一个List,并且需要显示到View中,那么ViewModel应该怎么处理呢?比如:

public class Customer

{

    public List<string> Habites { get; private set;} 

}

 

最直接的方法就是同样建立一个对应的ObservableCollection<string>。但是你会发现一个问题:怎么同步Model和ViewModel的这两个集合?最直接的方法就是通过事件来通知了,但是你会发现这样的代码并不是很简洁。目前我也没有一个好办法来解决这个问题:(。

 

ViewModel 和 View 之间的关系

ViewModel和View之间的关系是控制和显示的关系,ViewModel会控制View的显示,包括显示的内容和视图的状态。一般情况我们会为ViewModel定义一个DataTemplate,比如:

<DataTemplate DataType="{x:Type local:CustomerViewModel}">

    <Grid>

         <TextBlock Text="{Binding Name}"/>

    </Grid>

</DataTemplate>

 

按钮的Click事件的处理等,我们不再通过注册事件来处理,而是把ViewModel中的Command绑定到按钮中,比如

<Button Command={Binding AddCustomerCommand}/>

这样就避免了Code-Behind了,逻辑代码可以不依赖于界面。

 

常见问题及技术解决:

1. 事件绑定不了Command。

在实际的应用当中,你会发现有些时候很难做到不使用Code-Behind,比如一些事件,例如MouseDoubleClick,这些并不能进行Command的绑定,但是事实上,WPF已经提供了另一种技术 -- Attached Property -- 来解决的。网上有各种各样的Attached Property实现,但你遇到困难时不妨搜索一下。

这是一篇关于Attached Property的简单文章:http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

 

 

2. Dialog怎么应用MVVM。

这也是比较常见的问题,网上也有不少讨论,我将会总结一下我是怎么处理这个问题的。

 

View 和 Model 之间的关系

你会发现我们其实可以直接给Model定义View,而且免去了ViewModel这层,这显得更简单。但是这样做我个人觉得并不合适,这样做有可能会使你的Model变的不是很纯粹,比如:最后你可能会定义一些控件界面状态的字段来控制界面的状态,别忘了我们的目的就是为了让Model和View不再有任何耦合,除非你的觉得你的Model非常的简单,不会有任何的影响,不然最后又会回到原来的很糟糕的状态--逻辑和视图绑定到一块了。

 

下面是我学习的一片文章,里面还有一个很好的例子。

参考:

1. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MVVM Light 是一个开源的 MVVM (Model-View-ViewModel) 框架,用于开发 Windows 平台的应用程序。它的主要优点在于简洁易用、轻量级,支持 WPF、Silverlight、Windows Phone、Windows 8/8.1、Windows 10 UWP 等平台。 下面是一个简单的 MVVM Light 使用教程: 1. 首先,安装 MVVM Light 框架。可以通过 NuGet 包管理器安装,命令如下: Install-Package MvvmLight 2. 在项目中添加一个 ViewModel 类。这个类会绑定到 View 上。 3. 编写 View 的 XAML 代码。在根元素上添加 DataContext 属性绑定到 ViewModel。 4. 编写 ViewModel 类中的逻辑代码。这些代码会更新 View 的状态。 5. 在 View 的 XAML 代码中添加绑定。例如,将一个文本框的 Text 属性绑定到 ViewModel 中的一个属性上。 6. 在 ViewModel 中使用命令来处理 View 上的用户交互。 7. 按照需要使用其他 MVVM Light 的功能,例如消息传递、导航、本地化等。 最后,我需要提醒你 MVVM 是一种模式,不同的框架可能有不同的实现,每种框架都有它的优缺点,需要根据自己的需求来选择合适的框架. ### 回答2: MVVMLight是一个为Windows应用程序提供MVVM(Model-View-ViewModel)模式支持的开源框架。它是由Laurent Bugnion创建的,旨在简化应用程序的设计和开发。 MVVMLight提供了一组工具和库,帮助开发人员在应用程序中实现MVVM模式。其中包括ViewModelBase类,用于创建视图模型,并提供属性更改通知功能。它还提供了一个Messenger类,用于在视图模型之间进行消息传递,使它们能够相互通信。 除了上述基本功能外,MVVMLight还提供了其他实用工具,如ViewModelLocator,用于自动定位和创建视图模型实例。它还提供了EventToCommand功能,可以将事件绑定到命令,使开发人员能够将用户交互行为直接绑定到视图模型中的命令。 MVVMLight还提供了一些与平台相关的功能,如在WPF应用程序中的消息框服务和对话框服务。它还支持导航功能,可以帮助开发人员实现应用程序中的导航逻辑。此外,它还提供了对IoC(Inversion of Control)容器的集成,使开发人员能够轻松地使用依赖注入来管理应用程序中的对象。 总之,MVVMLight是一个强大而灵活的框架,可以帮助开发人员更轻松地实现MVVM模式,并提高应用程序的可维护性和可扩展性。它提供了许多实用工具和功能,帮助开发人员处理常见的应用程序开发任务,使他们能够更专注于业务逻辑的实现。无论是新手还是有经验的开发人员,都可以从MVVMLight中受益,并加快应用程序的开发进程。 ### 回答3: MVVMLight是一款用于开发基于MVVM设计模式的框架, 它是由GalaSoft的Laurent Bugnion所创建和开发的。MVVM代表模型(View-Model-View Model)视图模型,是一种用于构建用户界面的软件架构模式。 MVVMLight的教程涵盖了许多有关使用该框架的详细信息和指南。教程通常会从基础知识开始,逐步介绍MVVMLight的各个组件和功能。它将帮助开发人员了解如何设置和配置MVVMLight,以及如何使用它来构建可维护和可扩展的应用程序。 教程通常包括以下内容: 1. MVVM框架的简介和概述。 2. MVVMLight的安装和配置。 3. MVVMLight的主要概念和组件,例如ViewModelBase、RelayCommand、Messenger等。 4. 如何使用MVVMLight来绑定视图和视图模型。 5. 如何处理用户交互和数据验证。 6. 如何使用MVVMLight中的导航和导航参数。 7. 如何利用MVVMLight创建模块化和可测试的应用程序。 通过学习MVVMLight的教程,开发人员可以获得关于MVVM设计模式以及MVVMLight框架的深入理解。这将使开发人员能够更好地利用MVVMLight的功能和优势来开发高质量、易于维护的应用程序。 MVVMLight的教程对于想要进一步学习和探索MVVMLight的开发人员来说是非常有价值的资源,它提供了实用的示例和指导,以帮助开发人员快速上手并充分利用这个强大的框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值