silverlight中使用MVVM建构

合集下载

Silverlight使用MVVM模式(5):异步Validation数据验证和INotifyDataErrorInfo接口

Silverlight使用MVVM模式(5):异步Validation数据验证和INotifyDataErrorInfo接口

数据验证(Validation)是界面程序的常见需求,例如使用正则表达式验证用户输入的Email地址是否合法,然后在界面给出错误提示信息。

在Sivlerlight的MVVM模式中,我们在Model和ViewModel可以做Validation,然后需要把Model和ViewModel的Validation 结果和错误信息通知视图(View)。

在WPF中,我们使用IDataErrorInfo,在Silverlight4中,建议使用INotifyDataErrorInfo。

IDataErrorInfo先简单说一下IDataErrorInfo,这个接口实现了简单的数据验证和错误报告功能,只能说聊胜于无吧。

例子:1<TextBox Text="{Binding Path=, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True }"/>INotifyDataErrorInfo这个接口只有Silverlight4以上支持,非常强大,支持一个绑定属性多重错误、异步数据验证、自动通知视图错误信息、ErrorChanged事件、HasErrors属性、GetErrors方法等等。

定义:1publicinterface INotifyDataErrorInfo2 {3bool HasErrors { get; }45event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;67IEnumerable GetErrors(string propertyName);8 }实现这个INotifyDataErrorInfo接口也非常简单,来个简单的例子:1publicclass SimpleModel : INotifyDataErrorInfo2 {3publicevent EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;45private Dictionary<string, List<String>> _errors = new Dictionary<string, List<String>>();67privatestring _accountID = null;89publicstring AccountID10{11get { return _accountID; }12set13{14if (_accountID != value)15{16var propertyName = "AccountID";1718if (string.IsNullOrEmpty(value))19{20if (!_errors.ContainsKey(propertyName))21_errors.Add(propertyName, new List<string>());2223_errors[propertyName].Add("AccountID can't be null or empty"); 24}25else26{27if (_errors.ContainsKey(propertyName))28_errors.Remove(propertyName);29}3031NotifyErrorsChanged(propertyName);3233//Maybe you don't want to set this field to a value if the validation fails34_accountID = value;35}36}3738}3940public System.Collections.IEnumerable GetErrors(string propertyName)41{42if (_errors.ContainsKey(propertyName))43return _errors[propertyName];4445return _errors.Values;46}4748publicbool HasErrors49{50get { return _errors.Count >0; }51}525354privatevoid NotifyErrorsChanged(string propertyName)55{56if (ErrorsChanged != null)57ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));58}59 }异步Validation数据验证和INotifyDataErrorInfo接口这个例子稍微复杂,实现了异步调用WCF RIA Service进行业务逻辑的validation并在ViewModel中把验证的错误提示通知视图,完整的代码下载,需要VS2010和Silverlight环境。

稳扎稳打Silverlight(52)4.0绑定之ICommand命令和MVVM模式-电脑资料

稳扎稳打Silverlight(52)4.0绑定之ICommand命令和MVVM模式-电脑资料

稳扎稳打Silverlight(52)4.0绑定之ICommand命令和MVVM模式-电脑资料介绍Silverlight 4.0 MVVM 模式:* ICommand - 命令,。

可以将其绑定到 ButtonBase 或 Hyperlink 的 Command 属性上* MVVM 模式 - Model-View-ViewModel在线DEMO示例1、演示 ICommand 的应用MyCommand.cs代码/**ICommand- 命令。

可以将其绑定到ButtonBase或Hyperlink的Command属性上* bool CanExecute(object parameter) - 当请命令是否可以执行* event EventHandler CanExecuteChanged - 当请命令是否可以执行的状态发生改变时所触发的事件* void Execute(object parameter) - 当前命令被执行时,所调用的方法*/using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace mand{public delegate void Execute(object parameter);public delegate bool CanExecute(object parameter);public class MyCommand : ICommand{private Execute _executeMethod;private CanExecute _canExecuteMethod;public MyCommand(): this(null, null){}public MyCommand(Execute executeMethod): this(executeMethod, null){}public MyCommand(Execute executeMethod, CanExecute canExecuteMethod){_executeMethod = executeMethod;_canExecuteMethod = canExecuteMethod;}public bool CanExecute(object parameter){if (_canExecuteMethod == null)return true;elsereturn _canExecuteMethod(parameter);}public void Execute(object parameter){if (_executeMethod != null)_executeMethod(parameter);}public event EventHandler CanExecuteChanged;protected virtual void OnCanExecuteChanged(EventArgs e){if (CanExecuteChanged != null)CanExecuteChanged(this, e);}public void RaiseCanExecuteChanged(){OnCanExecuteChanged(EventArgs.Empty);}}}MyViewModel.cs代码using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace mand{public class MyViewModel{// 声明一个ICommand类型,用于绑定到ButtonBase或Hyperlink的Command属性上public ICommand Hello { get; set; }public MyViewModel(){// 绑定了Hello的命令被执行时则会调用ExecuteHello(object parameter)方法Hello = new MyCommand(ExecuteHello);}private void ExecuteHello(object parameter){MessageBox.Show("Hello: " + parameter.ToString());}}}Demo.xaml代码xmlns="/winfx/2006/xaml/pre sentation"xmlns:x="/winfx/2006/xaml"xmlns:d="/expression/blend/ 2008"xmlns:mc="/markup-compatibility/2006"xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windo ws.Controls.Navigation"xmlns:ViewModel="clr-namespace:mand"Title="Demo Page">2、MVVM 模式的 DemoUpdateCommand.cs代码using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace Silverlight40.Binding.MVVM{// 实现ICommand 接口,在MVVM 中它的作用是为ButtonBase 或Hyperlink 提供相应的行为逻辑public class UpdateCommand : ICommand{private ProductViewModel _viewModel;public UpdateCommand(ProductViewModel viewModel) {_viewModel = viewModel;}public bool CanExecute(object parameter){return true;}public event EventHandler CanExecuteChanged;public void Execute(object parameter){_viewModel.Update();}}}ProductViewModel.cs代码using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using ponentModel;namespace Silverlight40.Binding.MVVM{// MVVM 之ViewModel - 为了数据的绑定需要实现INotifyPropertyChanged接口;为了命令的绑定需要有相对应的ICommand类型的属性public class ProductViewModel: INotifyPropertyChanged{public ProductViewModel(): this (13, "wii"){}public ProductViewModel(int productId, string name) {_productId = productId;_name = name;}private int _productId;public int ProductId{get { return _productId; }set{_productId = value;RaisePropertyChangedEvent("ProductId");}}private string _name;public string Name{get { return _name; }set{_name = value;RaisePropertyChangedEvent("Name");}}public event PropertyChangedEventHandler PropertyChanged;private void RaisePropertyChangedEvent(string propertyName){if (PropertyChanged != null)PropertyChanged(this,new PropertyChangedEventArgs(propertyName));}public void Update(){MessageBox.Show(string.Format("将ID 为{0} 的名称更新为:{1}", _productId, _name));}public ICommand UpdateCommand{get{return new UpdateCommand(this);}}}}Demo.xaml代码xmlns="/winfx/2006/xaml/pre sentation"xmlns:x="/winfx/2006/xaml"xmlns:d="/expression/blend/ 2008"xmlns:mc="/markup-compatibility/2006"xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windo ws.Controls.Navigation"xmlns:vm="clr-namespace:Silverlight40.Binding.MVVM"Title="Demo Page">。

silverlight与数据模型设计模式

silverlight与数据模型设计模式

silverlight与数据模型设计模式摘要本文主要从几个方面论述了silverlight与众不同的设计模式和从其中衍生的程序设计方法,也就是数据模型设计模式。

关键词设计模式;富用户体验;mvvm模式;数据模型设计模式;事件触发;面向对象;松耦合中图分类号tp31 文献标识码a 文章编号 1674-6708(2011)55-0172-03silverlight 是微软推出的新一代web前端应用程序解决方案,它使用第三方插件的形式,轻量级的植入到浏览器中,使用与flash 相似的机制实现富用户体验的互联网应用,并且提供硬件加速的支持,一级与flash相同的对流媒体的支持,因其与flash的相似性,也被称为flash杀手。

html 5的出现为web带来了冲击,它具有对于各种媒体的支持,具有canvas对象,也可以用于实现游戏,矢量图形等功能,然而开发成本较高,目前缺少成熟的开发工具的支持,因此在短时间内还不能取代flash和silverlight的地位。

并且,在微软最擅长的标准化,模块化,统一设计模式上,silverlight给我们带来了很多的启示和可以借鉴的地方。

silverlight是wcf的轻量级版本,使用xaml的方式来抽象出ui层,使之与逻辑层分离,类似于mvc设计模式,但又是对mvc的进一步优化。

xaml是基于xml的一种表达形式,它将图形,媒体,动画和部分触发器逻辑集成在xml文档格式中,并不涉及代码,并且推出了blend开发工具,用于很方便的简单拖拽,点击就可以实现丰富绚丽的动画。

微软的这种做法实际上是将设计者与程序员的工作进行了彻底的分离,使得二者可以并行工作,互不干扰,设计者做设计者的事,程序员做程序员的事,二者之间只要通过舞台中的变量名进行联系和操作即可。

并且它也因为开发工具blend的支持,极大的降低了开发成本,较html和js控制的页面逻辑有很大的进步。

又因为它是基于第三方的运行时环境(run time),因此在任何机器和浏览器中都提供一致的表现,使得程序员不必再考虑兼容性问题,极大的降低了开发成本,缩短了开发周期。

Silverlight入门系列]使用MVVM模式(6):使用Behavior

Silverlight入门系列]使用MVVM模式(6):使用Behavior

Behavior把一些常用的行为封装成可重复使用的组件(Component),在理想状况下,Designer(设计师)或domain expert(特定领域的专家,例如财会人员、HR人员、或MIS)甚至可以完全不需要具备程序设计的观念,只需要了解基础的事件(Event)观念,就可以顺利的开发出一套系统,若需要实现特定的功能时,可商请developere为他们开发所需要的Behavior,designer只需要取得这些Behavior并使用即可。

例如,界面设计人员可以使用Expression Blend把一个Behavior拖到一个界面元素上,比如右键点击以后启动一段动画这个行为,这个界面元素就会自动执行,岂不是很清爽!(当然,执行函数还是要编程人员编写),来个例子:界面xaml:1<UserControl2xmlns="/winfx/2006/xaml/presentation"3xmlns:x="/winfx/2006/xaml"4xmlns:d="/expression/blend/2008"5 xmlns:mc="/markup-compatibility/2006"6xmlns:wm="clr-namespace:AsycValidation"7 xmlns:i="/expression/2010/interactivity" xm lns:ei="/expression/2010/interactions" x:Class="A sycValidation.MainPage"8mc:Ignorable="d"9 x:Name="MyUserControl"10 d:DesignHeight="300" d:DesignWidth="400">1112<Grid x:Name="Layout">13<TextBlock Height="32"HorizontalAlignment="Left" Margin="41,53,0,0" x:Name=" textBlock1" Text="Company:"VerticalAlignment="Top" Width="66"/>14<TextBox Height="31"HorizontalAlignment="Left" Margin="120,45,0,0" x:Name="t extBox1" Text="{Binding CompanyName, Mode=TwoWay, NotifyOnValidationError=Tru e}"VerticalAlignment="Top" Width="119"/>15<TextBox Height="30"HorizontalAlignment="Left" Margin="120,104,0,0" x:Name=" textBox2" Text="{Binding CompanyID, Mode=TwoWay, NotifyOnValidationError=True} "VerticalAlignment="Top" Width="119"/>16<Button Content="Button" Height="36"HorizontalAlignment="Left" Margin="120,156,0,0" x:Name="button1"VerticalAlignment="Top" Width="81">17<i:Interaction.Triggers>18<i:EventTrigger EventName="Click">19<ei:CallMethodAction MethodName="button1_Click"TargetObject="{Binding Elemen tName=MyUserControl}"/>20</i:EventTrigger>21<i:EventTrigger>22<ei:CallMethodAction MethodName="button1_loaded"TargetObject="{Binding Eleme ntName=MyUserControl}"/>23</i:EventTrigger>24</i:Interaction.Triggers>25</Button>26</Grid>27</UserControl>界面xaml.cs:1using System;2using System.Collections.Generic;3using System.Linq;4using ;5using System.Windows;6using System.Windows.Controls;7using System.Windows.Documents;8using System.Windows.Input;9using System.Windows.Media;10using System.Windows.Media.Animation;11using System.Windows.Shapes;1213namespace AsycValidation14{15publicpartialclass MainPage : UserControl16 {17public MainPage()18 {19InitializeComponent();2021CompanyModel m1 = new CompanyModel() { CompanyID = 1, CompanyName = "abc" }; 2223companyViewModel = new CompanyViewModel(m1);24this.DataContext = companyViewModel;2526 }2728publicvoid button1_Click()29 {30MessageBox.Show("ok");31 }3233publicvoid button1_loaded()34 {35MessageBox.Show("loaded");3637 }3839public CompanyViewModelcompanyViewModel { get; set; }4041 }42}注意给这个button定义了两个CallMethodAction的behavior:一个是点击事件,一个是加载Loaded事件。

管窥MVVMLightCommand参数绑定和事件传递

管窥MVVMLightCommand参数绑定和事件传递

管窥MVVMLightCommand参数绑定和事件传递前⾔由于在实际项⽬中,业务功能的增加导致软件开发规模在逐渐变⼤,所以我准备找个Silverlight框架来组织当前项⽬中的⽂件,以期能够让后续的业务功能增添和维护更加容易⼀些。

⽆意中,我在这篇⽂章中看到了当前Silverlight下所有的框架的评测:,当我看到MvvmLight toolkit在各⽅⾯都⽐较完备的时候,于是决定选择这个框架:在上,下载了MVVM Light Toolkit V4 RTM这个版本,因为我⽤的是vs2010,所以我下载了⽀持当前机器IDE的版本。

新建项⽬,选择MvvmLight(SL4),之后我们就可以看到项⽬结构了:其中:Design⽂件夹中的⽂件主要提供设计时运⾏⽀持Model⽂件夹则放置了富实体模型Skins⽂件夹则放置了样式⽂件定义ViewModel⽂件夹则放置了ViewModel对象,其实MainViewModel和MainPage是⼀对⼀的(ViewMoel-View)关系.⼆者的映射通过ViewModelLocator进⾏。

MainPage.xaml就是我们的视图页⾯下⾯我们就以例⼦来演⽰MvvmLight Toolkit中是如何实现MVVM模式,如何绑定命令,如何进⾏事件消息传递的。

⾸先,在这个框架中,MVVM模式的⼊⼝点为ViewModelLocator类,在这个类中,可以定义多个ViewModel属性,并且每个属性都可以通过ServiceLocator.Current.GetInstance⽅法进⾏映射,以便于暴露给前台绑定。

同时,在新增⼀个ViewModel类的时候,⼀定要在其提供的SimpleIoc对象容器中进⾏注册,以便于能够通过IOC的⽅式获取其实例。

做完映射后,就是我们的ViewModel对象了。

它需要继承⾃ViewModelBase类,这个类封装了ICommand,INotifypropertyChanged等接⼝,使⽤起来很⽅便。

Silverlight下的MVVM模式的应用

Silverlight下的MVVM模式的应用
李龙 澍 , 华骁 飞
( 安徽 大学 计算机科学与技术学院, 安徽 合肥 2 3 0 6 0 1 )
摘 要: 为 了改善 传统 开发方 式 和应用 R I A ( R i c h I n t e r n e t A p p l i c a t i o n , 富互联 网应 用程 序 ) 开 发技 术 , 文 中应 用 了一种 新 的
c h a r a c t e r i s i t c s o f c l e r a s t r u c t u r e , s t a b i l i t y a n d e a s e t o b e t e s t e d . Ke y wo r d s: RI A; S i l v e r l i g h t ; d e s i g n pa t t e m; M VVM
Ab s Wa  ̄ : I n o r d e r t o i mp r o v e t h e wa y o f t r a d i i t o n a l d e v e l o p me n t a n d a p p l y t h e RI A d e v e l o p me n t t e c h n o l o g i e s , a n e w d e s i g n p a t t e m , M V-
功 地将 数据 、 表示 和业 务逻 辑分 离 , 有 效地 改善 系统开 发 , 使 系统 具有 结构 清晰 、 可拓展 、 易测 试 的特点 。 关键词 : 富互 联 网应用 程序 ; S i l v e r l i g h t ; 设 计模 式 ; 模型一 视 图一 视 图模 型
中 图分 类号 : T P 3 0 2 . 1 文献标 识码 : A 文章 编 号 : 1 6 7 3 — 6 2 9 X( 2 0 1 3 ) 1 2 — 0 2 0 3 — 0 5

Silverlight入门系列]使用MVVM模式(9) 想在ViewModel中控制Storyboard动画?

Silverlight入门系列]使用MVVM模式(9) 想在ViewModel中控制Storyboard动画?

实现 Treeview 的展开状态持久化和自动恢复,配合 MVVM 实现不容易。

所以,MVVM 的 核心概念理解不难,在具体使用上则问题多多。

今天要讲的话题就是一个 MVVM 使用上的 具体问题: Silverlight 中的 Storyboard 动画是否可以在 ViewModel 中来控制? 为什么想在 ViewModel 中控制 Storyboard?假设我的业务逻辑在 ViewModel 中, 业务操作好了保存 Save 成功了就需要启动一个动画: Stobyboard.begin()。

而这个动画在视图中,怎么去控制它?这个需求很普遍吧。

确实很 普遍,但实现就不那么简单了,不像下面这样的 Storyboard 启动那么简单:1:<Imagex:Name="myImage" 2:Source="/man.png"> 3:<Image.Triggers> 4:<EventTriggerRoutedEvent="Image.Loaded"> 5:<BeginStoryboard> 6:<Storyboardx:Name="myStoryboard"> 7:<DoubleAnimationDuration="0:0:2" 8:Storyboard.TargetName="myImage" 9:Storyboard.TargetProperty="Opacity" 10:From="0"To="1"/> 11:</Storyboard> 12:</BeginStoryboard> 13:</EventTrigger> 14:</Image.Triggers> 15:</Image>解决方法一: 解决方法一:ViewModel 中用事件 Event 通知 View 启动 Storyboard 动画ViewModel 是对界面逻辑、业务逻辑、和模型数据的封装和抽象,ViewModel 不依赖于 具体的 View 视图,所以 ViewModel 根本不知道具体的某个 Storyboard,怎么去启动这 个动画呢? 解决问题思路有好多:第一种方法就是很自然的想到在 ViewModel 中用事件 Event 通知 View 启动动画。

MVVM实践教程

MVVM实践教程

MVVM实践教程算算,从事Silverlight和WPF的开发也有1年多的时间了,虽然时间不算长,虽然还没有突出的成就,但是感觉也还算⼀般。

但是,从头⾄今都没有去认真研究和使⽤过MVVM,虽然它被认为是Silverlight和WPF开发的最佳架构实践。

我想这⾥⾯还是有⼀些原因,就像⼀般开始我们始终都不会看好单元测试。

直到有⼀天你体会到它的魅⼒,它的好处。

最近的项⽬,却不得不采⽤MVVM的模式:UI没有定,甚⾄服务端的Service都没有定,但是不能等到这些都做好才开始展开我们的开发⼯作。

于是,痛下决⼼研究MVVM的模式,在学习过程中,发现⼀些问题。

MVVM的使⽤不仅仅是因为它需要新的思维,使View和ViewModel 之间的交互变得更⿇烦。

这其中还有另外的原因,那就是参考资料不全。

⼀般⽹上的资料都是⼀⽚简单的教程,⼤体都是怎么使⽤命令,怎么使⽤Binding的⽅式来建⽴应⽤程序。

这些⼏乎都出⾃John Smith的那篇WPF的⽂章。

⽽实际上,在开发中,还会遇到其他问题,例如页⾯切换,UI事件,并且简单的⽰例我们往往弄不清楚各个模块之间的职责和联系。

因为不能有效实践,从⽽被认为会影响开发效率⽽不被采⽤。

这⾥,我将⾃⼰学习总结的知识整理成⼀篇完整的⽰例,有提供源代码,源代码包含⽐较完整的⽰例,不仅包含数据绑定和命令的使⽤,还包含UI事件和UI的切换。

相信能解释⼤多数遇到的问题。

当然,如果你有更好的实践和建议,欢迎讨论……………1.MVVM设计模式简介MVVM的设计模式最早于2005年由微软的WPF和Silverlight架构师John Gossman在他的博客中提到。

以下是这篇⽂章的链接:MVVM设计模式基于MVC这种将UI和逻辑分离的结构思想。

传统的.NET平台下软件开发如和WPF/Silverlight⼤多数是基于CodeBehind这样的⽅式,我们往往将所有的代码全部写在后台代码⽂件中,例如UI操作,业务逻辑操作,IO,数据服务的调⽤等等。

Silverlight使用MVVM模式(1):MVVM核心概念

Silverlight使用MVVM模式(1):MVVM核心概念

MVVM模式是Model、View、ViewModel的简称,最早出现在WPF,现在Silverlight 中也使用该模式,MVVM模式是对MVC模式的变种。

哪儿变了?我认为MVVM和MVC 的主要变化在于MVVM更适合于XAML。

MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处:1. 低耦合。

视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model不可以不变,当Model变化的时候View也可以不变。

2. 可重用性。

你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。

3. 独立开发。

开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。

4. 可测试。

界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

MVVM的Model、View、ViewModel分工:1. View∙负责界面和显示,界面构成元素有window, controls, page, dataTemplete, custom controls….∙代码通常有XAML和XAML.CS组成,但后台代码应该很少∙通过DataContext和ViewModel绑定∙不直接和Model交互!∙控件可以和ViewModel的公共属性绑定,update需要双向绑定∙控件可以触发Behavior/Command调用ViewModel的方法,Command是View到ViewModel的单向通讯(View中触发事件,ViewModel中处理事件)2. ViewModel∙主要包括界面逻辑和模型数据封装,Behavior/Command事件响应,绑定的属性定义等∙ViewModel继承Model类,或者是Model的继承类∙是view和model的桥梁,是对Model的抽象,例如,model中数据格式是“年月日”,可以在viewModel中转换model中的数据为“日月年”以供视图(view)显示。

深入理解MVVM模式

深入理解MVVM模式

深入理解MVVM模式作者:谢伟来源:《速读·下旬》2015年第12期摘要:MVVM即Model-View –ViewModel,是微软WPF和Silverlight应用特有的一种界面设计模式。

使用MVVM设计模式可以帮助我们分离业务逻辑,显示逻辑和用户界面,使得我们的程序代码结构清晰,容易被阅读、测试、维护、替换、扩展和改进。

关键词: MVVM;设计模式;分层;用户界面一、什么是MVVM模式MVVM是Model-View-ViewModel的简写。

微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……。

这导致了软件UI层更加细节化、可定制化。

同时,在技术层面,WPF也带来了诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。

MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。

它立足于原有MVP框架并且把WPF的新特性揉合进去,以应对客户日益复杂的需求变化。

二、为什么要有MVVM模式开发UI,对一个专业软件并不容易。

它需要未知数据、交互式设计,可视化设计、联通性,多线程、国际化、验证、单元测试以及其他的一些东西才能完成。

考虑到UI要展示开发的系统并且必须满足用户对系统风格不可预知的变更,因此它是很多应用程序最脆弱的地方。

有很多的设计模式可以帮助解决UI不断变更这头难缠的野兽,但是恰当的分离和描述多个关注点可能很困难。

模式越复杂,之后用到的捷径越可能破坏之前正确的努力。

自从人们开始构建UI时,就有很多流行的设计模式让UI构建更容易。

比如,MVP模式在各种UI编程平台中都非常流行。

MVP是MVC模式的一种变体,MVC模式已经流行了几十年了。

基于Silverlight和MVVM模式的移动商业智能系统研究

基于Silverlight和MVVM模式的移动商业智能系统研究

的迅速 发展 , 将商 业智 能分 析 以用户 随 身携带 的智 能手 机 等移 动终 端实 时展 现给企 业 内所有 层 次用户 , 若 甚
至 是客 户及 商业 合作 伙伴 , 将使 得企 业 能够对 面 临的 问题 做 出快 速 反应 , 这 改善 客 户 服务 , 而 赢 得竞 争 优 从 势 , 大程 度地 发挥 企业 信息 的作 用. 最
该 移动商 业智 能 系统采 用 了层次 化 、 构化 的体 系结 构. 着 系统 中用 户 的增 加 , 以方便 地 增 加 响应 结 随 可 层次 或各 种 服务器 , 以提高 系统性 能 , 满足 企业 发展 的需 要. 次 , 其 系统具 有 强 大 的元 数 据管 理 功 能 , 能够 集 中管理 分布业 务 智能应 用 .
21 0 1年 6月
基 于 Slel h 和 MVVM 模 式 的 i ri t v g 移动商业智能 系统研究
曾 蔚 日 席
( 州 师 范学 院 数 学 与计 算机 科 学 学 院 , 建 泉 州 3 2 0 ) 泉 福 60 0
[ 要 ] 为 解 决 传 统 商 业 智 能 系 统 在 实 时 性 、 互 性 和 通 用 性 上 的 不 足 , 用 RI 技 术 设 计 摘 交 采 A
决策 , 同时 也 能为企 业 内其他 层 次用户 提供 战术 型 决策 和操 作 型 决 策口 . 企业 内 中层 、 ]而 基层 管 理 人员 及 一
线 员工 通 常 因外 出工 作 而无法 及 时在 电脑 前查 询分 析数 据. 随着 近年 来平板 电脑 、 能手 机等移 动终 端设 备 智
的交互 式应 用 程序 体验 。
Slel h 较之 其他 的 R A技 术有 着许 多特 有 的优 势. 先 , i eih 使 用 可 扩展 应 用 程序 标 记语 言 i rg t v i I 首 Sl r t v g ( xe s l Ap l ainMak pL n u g , AML 进行 界 面设计 , E tn i e pi t r u a g a e x b c o ) 并采 用 X AML格式 进行 数据 传输 , 用 到 户 端再 解 析为 具体 图像 . AML是微 软公 司 为构 建 应用 程 序 用 户界 面 而创 建 的一 种新 的 描述 性 语 言 , 提 X 它 供 了一种便 于 扩展 和定位 的语 法来 定义 和程 序逻辑 分 离 的用 户界 面. XAML属 于 X ML, 基于 文 本 的特 点 其

[Silverlight]MVVM+MEF框架练习

[Silverlight]MVVM+MEF框架练习

光学不练,对一些概念的理解就只能停留在表面了。

这个系列主要记录自己对Jounce框架的理解和测试代码,以加深对MVVM和Silverlight的一些概念的理解。

本例主要测试Jou nce框架中View和ViewModel的通信。

MVVM的优点我认为Model、View和ViewModel的设计原则:模型、视图和视图模型分离,主要有两方面的优点:1. 便于团队协作和单元测试。

开发人员开发出适合业务逻辑的Model和ViewModel,并在没有View的情况下就可以做单元测试;美工人员根据ViewModel设计好View;测试人员可以只根据View、ViewModel或者Model其中之一的情况下写测试代码。

还实现了更好的模块化,尽管有时我们都是一个人在做这些事情。

2.XAML系的特点,采用MVVM的模式,可以减少很多繁琐的界面更新的代码,例如对象属性改变后,在ViewModel中调用适当的方法,就可以完成界面的更新,这样我们可以更多的关心业务逻辑。

相对于传统的Winforms,更适合采用这种设计模式。

思维方式的改变我以前直接在View的后台代码里,想怎么控制界面都可以。

现在MVVM了,给我整分离了,ViewModel和View不能相互引用对方,两者如何通讯呢?例如我点击Save按钮,想要显示一个等待界面给用户:以前多方便,直接调用一个等待界面代码即可。

现在呢?点击事件抽象成Command,绑定由ViewModel来处理,而ViewModel不能引用View,又如何改变View的状态呢?Jounce又是如何做到的呢?我们想达到的是这种效果:可以有两种方法:1. 利用View和ViewModel的契约这种契约其实就是绑定,View界面元素的属性绑定到ViewModel的属性上,这样就形成了一种约定:ViewModel的属性会影响元素显示,反过来也一样(如果是双向绑定)。

View代码可以这样写:<Grid x:Name="LayoutRoot" Background="White"><StackPanel x:Name="Sp"><TextBlock FontSize="36" Text="{Binding Welcome}"/><Button Width="100" Margin="4" Content="Save" Command="{Binding Sav eCommand}"/></StackPanel><TextBlock Text="正在保存..." Visibility="{Binding IsSaving}" Foreground ="Blue" Height="50" x:Name="tbSaving" HorizontalAlignment="Center" VerticalAl ignment="Center"/></Grid>ViewModel这样写:[ExportAsViewModel(typeof (MainViewModel))]public class MainViewModel : BaseViewModel{public MainViewModel(){SaveCommand = new ActionCommand<object>(o =>{IsSaving = Visibility.Visible;});}public string Welcome{get { return InDesigner ? "Jounce Design-time View" : "Welcome to Jo unce."; }}public IActionCommand<object> SaveCommand { get; set; }Visibility _isSaving=Visibility.Collapsed;public Visibility IsSaving{get{return _isSaving;}set{_isSaving = value;RaisePropertyChanged("IsSaving");}}}Jounce的BaseViewModel实现了INotifyPropertyChanged接口,通过调用RaisePropert yChanged方法可以在属性改变时,通知界面更新。

silverlight 项目案例

silverlight 项目案例

"Silverlight 项目案例:深度解析与实践探讨"一、Silverlight 项目案例简介Silverlight 是一个基于 .NET Framework 的应用程序框架,它可以用来开发和部署互联网应用程序。

在本文中,我们将会深入探讨Silverlight 项目案例,以便更好地理解其深度和广度。

二、Silverlight 项目案例的开发过程1. Silverlight 项目案例的背景和需求在进行深入探讨之前,首先来看一下一个典型的 Silverlight 项目案例的背景和需求。

通常,一家企业需要一个在线视频播放器来展示其产品宣传视频,并且希望用户能够在网页上直接观看视频或者下载。

这个需求将会是我们在探讨中不断提及的重要主题。

2. 技术选型与开发架构在开发一个 Silverlight 项目案例时,我们需要考虑的技术选型和开发架构非常重要。

我们可能会选择使用 MVVM 模式来构建 Silverlight应用程序,或者使用 Entity Framework 来管理数据。

3. UI 设计与交互在Silverlight 项目案例中,良好的UI 设计和交互体验是至关重要的。

我们可能会涉及到设计响应式布局、实现动画效果、以及优化用户交互体验的主题。

三、Silverlight 项目案例的实际应用与价值1. 实际应用场景与案例分析通过对实际应用场景的分析,我们可以更直观地理解 Silverlight 项目案例的实际应用价值。

我们可以探讨该在线视频播放器是如何满足企业宣传需求的,以及其在用户体验和功能上的优势。

2. 技术实现与解决方案借助 Silverlight 项目案例,我们可以深入探讨其涉及的技术实现和解决方案。

我们可以分析该在线视频播放器是如何实现视频流的加载和播放的,以及如何处理各种格式的视频文件。

这些内容将会是我们在文章中多次提及的重要主题。

3. 成果展示与用户反馈我们可以共享该 Silverlight 项目案例的成果展示,并对用户反馈进行总结。

软件架构模式中的MVVM模式

软件架构模式中的MVVM模式

软件架构模式中的MVVM模式在软件开发中,架构模式是十分重要的一部分。

它可以帮助开发人员在软件设计的过程中更加有章可循地进行开发,能够减少代码的耦合度、提高代码的复用性,并使整个系统更容易维护。

其中,MVVM模式是一个应用广泛的设计模式,本文将探讨MVVM模式在软件架构中的重要性和应用。

一、什么是MVVM模式MVVM模式即是Model View ViewModel模式,它是一种软件架构模式。

该模式主要被用于.NET技术上的WPF和Silverlight应用程序中,但是它也可以被用于其他开发平台上。

MVVM模式可以帮助开发人员把开发的业务逻辑和UI交互分离来,从而减少代码的复杂度,使得开发的过程更加清晰和容易理解。

它将数据、UI和业务逻辑之间进行了优美的分离,把数据和UI之间的依赖关系通过ViewModel来实现。

二、MVVM模式的结构MVVM模式主要包含三个部分:Model(模型)、View(视图)和ViewModel(视图模型)。

其中,Model表示数据模型,View表示用户界面,ViewModel是负责将View与Model之间的数据流动起来的中间件。

以下是三个部分的详细介绍:1、Model(模型):表示应用程序的业务逻辑和数据模型,它通常会和业务逻辑和数据访问结合在一起。

它通过提供数据接口的方式向ViewModel提供数据,ViewModel可以通过此接口获取或操作Model数据,数据改变时也可以通知ViewModel更新。

2、View(视图): 表示应用程序的用户界面,它主要用于展示ViewModel所提供的数据。

当用户对View进行了操作后需要反馈给ViewModel,ViewModel则进一步处理数据并将数据重新展示到View上。

3、ViewModel(视图模型): 是View与Model之间的桥梁,它从Model中获取数据,并将数据展示到View上。

当用户对View进行操作后,ViewModel将处理这些事件,然后再将数据重新展示到View上。

现有Silverlight程序使用mvvmlight开发框架教程

现有Silverlight程序使用mvvmlight开发框架教程

现有Silverlight程序使用mvvmlight开发框架教程1孙高勇学习整理2012-03-161)创建Silverlight 应用程序。

2)添加mvvmlight引用,如果使用模板创建,会自动生成引用,而这里我们需要自己添加。

3)添加ViewModels、Locators、Models文件夹。

4)为MainWindow添加ViewModel,在解决方案浏览器中,右键ViewModel文件夹,添加新类,类名称为MainViewModel,如果安装了mvvmlight模板,选择类模板为MvvmViewModel5)添加类ViewModelLocator,我们叫它ViewModel加载器,在解决方案浏览器中,右键项目名称,添加新类,类名称为ViewModelLocator,如果安装了mvvmlight模板,选择类模板为MvvmViewModelLocator。

6)打开App.Xaml,先添加ViewModel命名控件引用,然后为ViewModelLocator添加一个全局的资源,app.xaml的内容如下:<Applicationx:Class="SilverlightApplication8.App"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"xmlns:d= "/expression/blend/2008"xmlns:mc="/markup-compatibility/2006"xmlns:vm="clr-namespace:SilverlightApplication8.Locators"mc:Ignorable="d"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Assets/Styles.xaml"/></ResourceDictionary.MergedDictionaries><vm:ViewModelLocator x:Key= "Locator" d:IsDataSource= "True" /> </ResourceDictionary><!--全局 View Model 加载器--></Application.Resources></Application>7)打开MainWindow.xaml文件,首先为MainWindow设置DataContext为MainViewModel,MainWindow.xaml代码如下:<UserControlx:Class="SilverlightApplication8.MainPage"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Control s.Navigation"xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Contro ls.Navigation"xmlns:d="/expression/blend/2008"xmlns:mc="/markup-compatibility/2006"mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"DataContext= "{Binding Main,Source={StaticResource Locator}}">。

使用Silverlight实现报表生成的技术研究

使用Silverlight实现报表生成的技术研究

使用Silverlight实现报表生成的技术研究作者:邹珺来源:《科技创新与生产力》 2016年第2期邹珺(苏州农业职业技术学院,江苏苏州 215008)摘要:介绍了Microsoft ReportViewer控件、Silverlight客户端的MVVM模式、Silverlight用户界面功能、 Web服务,提出了使用Silverlight实现报表生成的技术,Silverlight客户端使用MVVM模式,将项目分为Model层、View层和ViewModel层,定义 Web服务,使用ReportViewer报表查看器控件,通过Silverlight客户端调用定义在中的Web报表,实现报表的生成和显示。

关键词:Silverlight;ReportViewer;中图分类号:TP311.52;TP311.1 文献标志码:A DOI:10.3969/j.issn.1674-9146.2016.02.092收稿日期:2015-08-20;修回日期:2015-12-20作者简介:邹珺(1981-),女,江苏苏州人,硕士,讲师,主要从事软件开发研究,E-mail:zj_anna0025@。

报表程序是Silverlight企业级程序中非常重要的部分之一。

Visual Studio 2010提供了对于.rdlc报表的编辑能力,使用ReportViewer的可分发版本,可以将.rdlc部署在一个服务器页面中,并使用ReportViewer运行库在服务器端生成报表,传回到客户端。

1 Microsoft ReportViewer控件简介Microsoft ReportViewer是一个可自由分发的控件,允许开发人员在.NET程序中嵌入报表。

使用Visual Studio 2010提供的报表编辑器,报表设计人员可以以拖动的方式设计复杂报表[1]。

ReportViewer控件提供了本地模式和远程模式。

本地模式使用控件内置的渲染引擎进行报表输出,远程模式将报表部署到报表服务器中输出[2]。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

绑定数据源: <sdk:Label Height="28" HorizontalAlignment="Left" Margin="105,335,0,0" Name="label2" VerticalAlignment="Top" Width="120" Content="{Binding Path=Count}" />
• void obj_getCustomerCompleted(object sender, getCustomerCompletedEventArgs e) • //异步调用完触发事件 对象 sender 得到完成结果 • { • Class2 c2 = e.Result as Class2; //实例化 c2 为Class2反回的结果 • LayoutRoot.DataContext = c2; //将结果付给 LayouRoot.DataContext(自动找 到 绑定好的地方并降至传递过去) • }
测试WCF服务是否可用
1添加工具 地址 2测试
地址: 系统盘下:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe
在silverlight中将建好的WCF服务引进去
Silverlight应用程序右键添加服务引用
在界面接收和传递参数
using SilverlightApplication9.ServiceReference1; //引用WCF服务 才能使用类库中类 private void button1_Click(object sender, RoutedEventArgs e) { ServiceReference1.Class2 c2 = new Class2(); //实例化类库中类 ServiceReference1.Service1Client obj = new Service1Client(); obj. getCustomerCompleted += new EventHandler<getCustomerCompletedEventArgs>(obj_getCustomerCompleted); //注册接口事件 ername1 = textBox1.Text; //用类传递参数 c2.Password1 = textBox2.Text; obj.getCustomerAsync(c2); //异步获得 参数 }
Silverlig用程序
然后解决方案右键新建项目 创建一个类库
然后解决方案右键新建项目 创建一个WCF服务应用
在类库中 编写传递参数的类
• • • • • • • • • • public class Class2 { private string _username1; //定义一个私有变量 用来接收传到雷利的值 public string Username1 //还要定义一个公共的方法 和他对应 让外部可以调用这个方法 { get { return _username1; } set { _username1 = value; } }
}
将类库引入到 WCF服务应用程序中去 应用后可在WCF中使用类库中类
在WCF中右键添加应用 WCF
返回的参数
带入的参数 同时将类实例化
• public interface IService1 • { • • • • } [OperationContract] Class2 getCustomer(Class2 c2); //创建接口规则规定带入的参数 和返回的参数
编写查询语句
创建接口共享文件clientaccesspolicy.xml • • • • • • • • • • • • • • <?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/>" </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> //代码固定
相关文档
最新文档