`

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

    博客分类:
  • MVVM
阅读更多

Behavior把一些常用的行为封装成可重复使用的组件(Component)在理想状况下,Designer(设计师)domain expert(特定领域的专家,例如财会人员、HR人员、或MIS)甚至可以完全不需要具备程序设计的观念,只需要了解基础的事件(Event)观念,就可以顺利的开发出一套系统,若需要实现特定的功能时,可商请developere为他们开发所需要的Behaviordesigner只需要取得这些Behavior并使用即可。例如,界面设计人员可以使用Expression Blend把一个Behavior拖到一个界面元素上,比如右键点击以后启动一段动画这个行为,这个界面元素就会自动执行,岂不是很清爽!(当然,执行函数还是要编程人员编写),来个例子:

界面xaml:

 

View Code
1 <UserControl 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:wm="clr-namespace:AsycValidation" 7 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="AsycValidation.MainPage" 8 mc:Ignorable="d" 9 x:Name="MyUserControl" 10 d:DesignHeight="300" d:DesignWidth="400"> 11 12 <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="textBox1" Text="{Binding CompanyName, Mode=TwoWay, NotifyOnValidationError=True}" 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 ElementName=MyUserControl}"/> 20 </i:EventTrigger> 21 <i:EventTrigger> 22 <ei:CallMethodAction MethodName="button1_loaded" TargetObject="{Binding ElementName=MyUserControl}"/> 23 </i:EventTrigger> 24 </i:Interaction.Triggers> 25 </Button> 26 </Grid> 27 </UserControl>

 

界面xaml.cs:

 

View Code
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Windows; 6 using System.Windows.Controls; 7 using System.Windows.Documents; 8 using System.Windows.Input; 9 using System.Windows.Media; 10 using System.Windows.Media.Animation; 11 using System.Windows.Shapes; 12 13 namespace AsycValidation 14 { 15 public partial class MainPage : UserControl 16 { 17 public MainPage() 18 { 19 InitializeComponent(); 20 21 CompanyModel m1 = new CompanyModel() { CompanyID = 1, CompanyName = "abc" }; 22 23 companyViewModel = new CompanyViewModel(m1); 24 this.DataContext = companyViewModel; 25 26 } 27 28 public void button1_Click() 29 { 30 MessageBox.Show("ok"); 31 } 32 33 public void button1_loaded() 34 { 35 MessageBox.Show("loaded"); 36 37 } 38 39 public CompanyViewModel companyViewModel { get; set; } 40 41 } 42 }

 

注意给这个button定义了两个CallMethodAction的behavior:一个是点击事件,一个是加载Loaded事件。

 

1 <Button Content="Button" Height="36" HorizontalAlignment="Left" Margin="120,156,0,0" x:Name="button1" VerticalAlignment="Top" Width="81" > 2 <i:Interaction.Triggers> 3 <i:EventTrigger EventName="Click"> 4 <ei:CallMethodAction MethodName="button1_Click" TargetObject="{Binding ElementName=MyUserControl}"/> 5 </i:EventTrigger> 6 <i:EventTrigger> 7 <ei:CallMethodAction MethodName="button1_loaded" TargetObject="{Binding ElementName=MyUserControl}"/> 8 </i:EventTrigger> 9 </i:Interaction.Triggers> 10 </Button>

 

实现步骤:在VS2010中右键点击xaml文件“在Expression Blend中打开...”,然后左边拖一个Behavior到控件上来,配置属性,保存即可。要注意的是TargetObject属性配置。

Behavior or Command?

commandsandbehavior

MVVM设计模式为了实现UI元素也UI界面逻辑分离项目组决定使用MVVM设计模式。把界面逻辑写在ViewModel层,View层由美工设计,通过绑定VM层的数据,实现分离。可是问题出来了,UI元素如何触发VM层的事件呢? 最开始很多人建议使用command命令,因为silverlight/wpf的很多控件都提供了Command属性。感觉还挺好使,只需要绑定VM层的ICommand属性就可以了。可是后来问题越来越复杂,主要出来以下几方面的问题:

  (1) 只有ButtonBase提供了Command属性。其他没有继承这个基类的元素不提供此接口。需要自己扩展。

  (2) UI元素事件一般会有很多,比如左击、右击、拖拉、load、unload等。

  (3) UI元素可能在初始化时就会需要一些操作,比如Load事件。

 

开始我们使用Prism提供的DelegateCommandCompositeCommand类来处理,可是对于左、右击这种情况很棘手,重写ICommand,那么多UI元素想累死啊,终于在微软Expression blend中找到答案。使用behavior,一切搞定。

 

Behavior提供CallMethodAction、ChangePropertyAction、DataStateBehavior等十三个行为,足够你处理一般事件调用情况了。比如CallMethodAction:提供EventName、MethodName两个属性,EventName:你可以选择任意元素事件,MethodName:可以让你直接绑定方法,基本上可以解决所有问题。使用也很简单,只需要在Blend中把相关行为Behavior拖放到控件上,然后设置相关属性,一切OK!

有哪些Behavior可用?

首先在Expression Blend控件库左边的behavior部分已经有好多实现的行为,可直接拖过来用,当然网上资源也很多(如这个),还能自己扩展。

behavior

自定义Behavior

举个例子,Silverlight文本框的一个老问题就是它只在失去焦点的时候才更新绑定源,失去焦点才做Validation,我们来编写一个behavior可以简单的解决这个问题:textbox文字改变就立即validation并更新绑定数据源。下载本CustomBehavior示例源代码

代码:

 

TextBoxUpdateBehavior : Behavior
1 using System; 2 using System.Net; 3 using System.Windows; 4 using System.Windows.Controls; 5 using System.Windows.Documents; 6 using System.Windows.Ink; 7 using System.Windows.Input; 8 using System.Windows.Media; 9 using System.Windows.Media.Animation; 10 using System.Windows.Shapes; 11 using System.Windows.Interactivity; 12 13 namespace AsycValidation 14 { 15 public class TextBoxUpdateBehavior : Behavior<TextBox> 16 { 17 public TextBoxUpdateBehavior() 18 { 19 } 20 protected override void OnAttached() 21 { 22 base.OnAttached(); 23 AssociatedObject.TextChanged += AssociatedObjectOnTextChanged; 24 } 25 private void AssociatedObjectOnTextChanged(object sender, TextChangedEventArgs args) 26 { 27 var bindingExpr = AssociatedObject.GetBindingExpression(TextBox.TextProperty); 28 bindingExpr.UpdateSource(); 29 30 } 31 protected override void OnDetaching() 32 { 33 base.OnDetaching(); 34 AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged; 35 } 36 } 37 }

 

xaml

 

Xaml code
<UserControl xmlns:wm="clr-namespace:AsycValidation" <TextBox Height="30" HorizontalAlignment="Left" Margin="120,104,0,0" x:Name="textBox2" Text="{Binding CompanyID, Mode=TwoWay, NotifyOnValidationError=True}" VerticalAlignment="Top" Width="119" > <i:Interaction.Behaviors> <wm:TextBoxUpdateBehavior/> </i:Interaction.Behaviors> </TextBox> </UserControl>

 

(运行后如何看效果:在第二个textbox输入1,输入2,输入1,看看validation)下载本CustomBehavior示例源代码

(本示例同时演示了Behavior, CustomBehavior, Validation, INotifyPropertyChanged, INotifyDataErrorInfo, MVVM, WCF Ria Service, 异步validation...)

更复杂的Custom Behavior会在后续博文中放出....

分享到:
评论

相关推荐

    如何创建更好的Silverlight程序系列课程(3):Silverlight & MVVM

    在本课程中,我们将深入探讨如何利用Silverlight技术与Model-View-ViewModel (MVVM)设计模式相结合,创建更高效、可维护性更强的Web应用程序。MVVM是一种流行的设计模式,特别适合于富客户端应用程序,如Silverlight...

    silverlight MVVM模式示例

    **银光(Silverlight)MVVM模式详解** MVVM(Model-View-ViewModel)模式是一种在软件开发中广泛采用的设计模式,特别是在UI开发领域,如Windows Presentation Foundation (WPF)和Silverlight应用中。该模式将业务...

    Silverlight MVVM模式应用

    【Silverlight MVVM模式应用】 在软件开发领域,特别是Web应用程序设计中,Silverlight作为一个强大的RIA(Rich Internet Application)框架,被广泛应用于构建交互性强、用户体验丰富的应用。MVVM(Model-View-...

    Silverlight中使用MVVM

    在 Silverlight 应用开发中,MVVM(Model-View-ViewModel)模式是一种常见的设计模式,它将应用程序的用户界面(View)、业务逻辑(ViewModel)和数据模型(Model)分离,提高了代码的可测试性和可维护性。...

    MVVM in Delphi: Architecting and Building Model View ViewModel Applications

    "MVVM in Delphi: Architecting and Building Model View ViewModel Applications" 2016 | ISBN-10: 148422213X | 143 pages | PDF, EPUB | 23 MB Dive into the world of MVVM, learn how to build modern ...

    silverlight做的自定义日历(MVVM模式)

    本项目是基于Silverlight实现的一个自定义日历组件,采用了MVVM(Model-View-ViewModel)设计模式,这种模式在现代软件开发中被广泛应用,尤其在UI设计中,因为它提供了更好的可测试性和可维护性。 **MVVM模式详解...

    Silverlight探秘系列课程(1):创建第一个Silverlight应用

    这使得动态更新视图变得简单,尤其在MVVM(Model-View-ViewModel)设计模式下。 8. **动画和多媒体**: Silverlight内置了强大的动画和媒体播放功能。你可以创建平滑的过渡效果,播放音频和视频,甚至实现复杂的...

    WPF与Silverlight的MVVM模式教程

    ### WPF与Silverlight的MVVM模式教程:深入解析与实战指南 #### 一、MVVM模式概览 MVVM(Model-View-ViewModel)模式是一种软件架构模式,旨在简化用户界面的开发过程,尤其在WPF(Windows Presentation ...

    MVVM模式下的silverLight基于MySQL数据库的实例解析

    在本实例中,我们将展示如何使用 MVVM 模式开发一个基于 MySQL数据库的 SilverLight 应用程序,实现用户根据用户名的模糊查询。 MVVM 模式的优点 MVVM 模式解决了在 WPF/Silverlight 应用程序开发中产生的业务层和...

    使用Command机制实现的Silverlight4.0多层MVVM模式简单案例

    "使用Command机制实现的Silverlight4.0多层MVVM模式简单案例"是一个适合初学者学习的示例,它演示了如何在Silverlight中应用MVVM模式来构建一个分层的、可维护的UI。通过了解并实践这个案例,开发者可以掌握MVVM的...

    WPF MVVM 模式使用DataGrid

    本篇文章将详细探讨如何在MVVM模式下有效地使用DataGrid控件。 **MVVM模式** MVVM模式由三个主要部分组成: 1. **Model(模型)**:这是应用程序的核心业务逻辑,通常与数据库或服务交互,处理数据的获取和存储。 2...

    Silverlight中使用MVVM.docx

    在Silverlight应用中,MVVM(Model-View-ViewModel)是一种设计模式,它提倡将业务逻辑、用户界面和数据模型分离,从而实现更清晰的代码结构和更好的可测试性。以下是对MVVM模式在Silverlight中的应用进行的详细说明...

    关于silverlight中MVVM模式下的数据验证

    在Silverlight应用开发中,MVVM(Model-View-ViewModel)模式是一种常用的设计模式,它将业务逻辑、用户界面和数据模型分离,提高了代码的可测试性和可维护性。本篇将深入探讨在Silverlight中如何在MVVM模式下进行...

    SilverLight在MVVM开发模式下对MySQL数据库操作源码

    此外,由于SilverLight是一个已过时的技术,所以你可能需要在现代浏览器中使用其他框架(如Blazor或Angular)来实现类似的功能,但MVVM模式仍然是适用的。 总的来说,"SilverLight在MVVM开发模式下对MySQL数据库...

    实现mvvm模式 Silverlight

    MVVM(Model-View-ViewModel)模式是一种设计模式,尤其在开发富客户端应用程序时非常流行,如Silverlight。这种模式将应用程序分为三个主要组件:模型(Model)、视图(View)和视图模型(ViewModel)。MVVM的核心...

    Silverlight中使用MVVM.pdf

    ### Silverlight中使用MVVM详解 #### 一、MVVM模式简介 MVVM(Model-View-ViewModel)模式是一种软件架构设计模式,主要用于简化用户界面的开发与维护工作。此模式将应用程序分为三个核心组件:Model(模型)、...

    Silverlight MVVM模式

    **Silverlight MVVM模式** MVVM(Model-View-ViewModel)模式是软件开发中的一个设计模式,尤其在创建用户界面时被广泛采用。在Silverlight应用程序中,MVVM模式能够帮助开发者实现清晰的代码结构,提高可测试性,...

    WPF简单计算器 MVVM模式

    **WPF简单计算器 MVVM模式** 本项目是一个基于Windows Presentation Foundation (WPF)设计的简单计算器,采用Model-View-ViewModel (MVVM)设计模式。MVVM是一种在XAML环境中非常流行的开发模式,它将业务逻辑、用户...

Global site tag (gtag.js) - Google Analytics