Telerik UI中的MVVM支持
为WPF

MVVM支持

什么是MVVM?

在软件开发中,如何组织开发工作有无数种模式。MVVM或模型-视图-视图模型是一种基于WPF(和Silverlight)应用程序关注点分离的开发模式。为此,应用程序被分解为三个主要组件:视图、ViewModel和模型。

视图

视图从顶部开始工作,负责显示给用户的内容。从这个角度来看,视图可以被认为是一个模板,它将向用户显示某种形式的信息,并在应用程序中处理用户交互。这可以是提交表单、拍卖搜索引擎或任何其他可能的面向用户的场景。在许多情况下,视图将由专门从事UX(用户体验)的设计人员处理,但对应用程序中的领域或业务逻辑几乎一无所知。考虑到这一点,您不希望将任何复杂的业务代码直接放入视图中。相反,您希望将其抽象出来,以便视图和业务逻辑可以独立工作,并通过WPF和Silverlight中提供的丰富绑定基础设施进行连接。

视图模型

这就把我们带到了ViewModel,它是应用程序的真正主力,它包含业务逻辑和应用程序的核心。通过数据绑定、公共属性和集合,ViewModel可以公开给View,甚至可以根据绑定类型进行修改(在MSDN中查看更多关于数据绑定的信息)SilverlightWPF).这使得应用程序的表示和逻辑之间能够清晰地分离。

模型

最后,但肯定不是最不重要的,是模型。在许多情况下,模型将派生于ORM系统,例如Telerik数据访问或实体框架,但通常应用程序的其余部分与模型无关(通常还使用存储库模式来包装ORM以进行进一步抽象)。不管数据来自何处,只要ViewModel调用了正确的方法并理解了底层类结构,您就拥有了一个完整且内聚的应用程序。当这三个元素结合在一起时,您就得到了一个功能齐全的应用程序。视图处理用户交互并向用户显示信息,模型负责应用程序的数据以及正在执行的不同CRUD和查询操作,ViewModel作为胶水存在,通过Silverlight和WPF数据绑定引擎将这两者结合起来。

为什么使用MVVM?

在这个世界中,我们能够从工具箱中拖放一个复杂的控件,连接几个事件,接收快速功能,然后转移到下一个工作项,我们有时会忘记,简单的软件开发并不一定等同于结构良好、易于扩展和单元可测试的软件。MVVM可以帮助解决所有这些问题。

在使用MVVM模式进行开发时,某些代码应该存在的位置之间有明确的区别。由于视图完全负责表示,所以它不包含任何代码(除非代码是非常特定于视图的,尽管人们对这一论点持两种观点),它只负责显示数据和收集反馈。ViewModel包含可以通过绑定访问的逻辑,但不会直接与视图对话。事实上,ViewModel完全不需要知道将要连接到它的视图是什么。因此,如果功能没有像预期的那样工作,您可以快速检查视图以确保绑定语句匹配;否则,你的ViewModel是分段和分离的,可以在UI之外进行测试。

事情把我们带到了单元测试——测试小“单元”代码以确保它们的功能按预期工作的过程。当你使用Silverlight和WPF中默认的基于事件的交互时,你的测试依赖于与UI的交互。在这些情况下,自动化测试肯定会发挥作用,并且可以利用它来确保你的UI在你开发应用程序时保持功能。但是,在任何东西接触UI之前,您都希望非常确定应用程序将按预期工作,这导致我们在代码接触UI之前对其进行单元测试。为了分别测试这三个组件中的每一个,您需要将它们的依赖关系隔离到下面的层。例如,如果你想测试ViewModel,你将需要以某种方式模拟模型,以验证ViewModel的行为。这是框架喜欢的地方JustMock可以帮你简化这个过程。

采用更模块化、更分段的方法(如MVVM)进行开发的另一个原因是可扩展性和可维护性的结合。使用标准的拖放编程方法,你经常会得到一堆乱七八糟的代码,难以阅读,更难调试。使用MVVM模式,您可以清楚地区分视图代码、ViewModel中的业务和交互逻辑以及与模型和数据库发生的后端交互。如果您需要调整某些操作背后的业务逻辑,您可以轻松地修改ViewModel,而不必触及视图或模型。视图也是如此。如果您的设计人员想要更新应用程序的外观,他们可以很容易地替换视图。他们只需要确保新的View和ViewModel上的公共属性和集合之间的绑定语句匹配。

远程支持MVVM

在Telerik,我们对不断增长和变化的。net生态系统中出现的开发模式和实践并不陌生。从计划在Silverlight 5中增加对MVVM模式的支持可以看出,甚至微软也已经接受了MVVM作为使用Silverlight和WPF进行严肃企业开发的实际标准。甚至在此之前,Telerik的开发人员一直在努力工作,以确保我们的所有组件,包括WPF的UI、Silverlight的UI和WPF控件套件的UI都支持MVVM模式。

以RadGridView为例。您总是可以采取简单的方法,并允许RadGridView为您生成基于您的数据源的列,但有时我们想要更多的控制显示的内容。查看下面的代码,我们可以看到MVVM在Silverlight/WPF UI中的三个关键部分:

MVVM在行动与UI为Silverlight/WPF

由于我们意识到如此多不同的设置需要绑定才能在基于mvvm的环境中发挥作用,因此在每个版本中,我们都会努力确保我们的控件尽可能符合mvvm,并始终支持如上所述的绑定场景。这种对MVVM模式的嵌入式支持的两个例子是我们在程序集中包含了两个必要的元素——ViewModelBase和一个DelegateCommand Implementation。当使用MVVM时,我们需要确定的一件事是确保UI根据ViewModel中的变化进行更新,因此ViewModelBase包含了INotifyPropertyChanged的实现,允许我们像下面这样通知UI更新:

ViewModelBase

另一方面,DelegateCommand是iCommand接口的实现,它允许在View和ViewModel之间使用命令。由于MVVM不鼓励使用隐藏代码文件来提供更清晰的关注点分离,因此我们需要某种方法来支持典型事件通过ViewModel填充,以便用户可以与应用程序交互。举个例子,我们可以从ViewModel中绑定一个RadButton到一个DelegateCommand,并只使用Xaml和ViewModel将它连接到RadGridView:

绑定RadButton

而在我们的ViewModel中,我们使用一个DelegateCommand来执行一个基于传递参数的动作:

使用DelegateCommand

Telerik还创建了一个丰富而强大的路由命令框架,允许与我们的控件进行进一步的无代码交互。一个很好的例子就是RadGridViewCommand,它允许你在RadGridView中通过简单的元素到元素绑定来触发命令。为了实现这一点,我们可以使用一个同时设置Command和CommandTarget的RadButton:

使用RadButton命令和CommandTarget

而在我们的ViewModel上,我们所需要做的就是初始化我们将要使用的RadGridViewCommands:

初始化RadGridViewCommands

Telerik提供了两个开箱即用的基本MVVM粘合元素:位于Telerik. windows . controls .dll中的DelegateCommand和ViewModelBase类。我们还开发了自己的路由命令框架,它允许一些更复杂的控件公开命令,以公开它们的行为。

学习资源

  • 学习如何利用MVVM模式和OData,使用RadGridView for Silverlight按需加载层次结构。阅读博客文章
  • 如何使用RadTreeView与MVVM模式和OData。阅读博客文章
  • 探索RadDomainDataSource并学习如何通过RadDomainDataSource,使用MVVM模式轻松地连接RadGridView来利用WCF RIA服务。万博体育手机版网址阅读博客文章
进一步阅读的链接:
Baidu
map