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


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提供的DelegateCommand和CompositeCommand类来处理,可是对于左、右击这种情况很棘手,重写ICommand,那么多UI元素想累死啊,终于在微软Expression blend中找到答案。使用behavior,一切搞定。

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

有哪些Behavior可用?

首先在Expression Blend控件库左边的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...)

转载于:https://www.cnblogs.com/Areas/archive/2011/09/07/2169886.html

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

  1. Silverlight入门系列]使用MVVM模式

    [Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制Storyboard动画? (2011-09-07 16:12) [Silverlight入门系列]使用MVVM ...

  2. Silverlight入门系列]使用MVVM模式(1):MVVM核心概念

    MVVM模式是Model.View.ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM模式是对MVC模式的变种.哪儿变了?我认为MVVM和MVC的主要变化在 ...

  3. [Silverlight入门系列]使用MVVM模式(1):MVVM核心概念

    编辑器加载中...MVVM模式是Model.View.ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM模式是对MVC模式的变种.哪儿变了?我认为MVVM和 ...

  4. [Silverlight入门系列]使用MVVM模式(3):Model的INotifyPropertyChanged接口实现

    当客户端绑定一个数据模型以后,数据模型变化以后可以自动通知客户端更新界面显示,这就是INotifyPropertyChanged接口要做的工作.INotifyPropertyChanged 接口用于向 ...

  5. [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现

    本文说说ViewModel的这个INotifyPropertyChanged接口可以用来做啥? 举例1:我有个TabControl,里面放了很多View,每个由ViewModel控制,我想是想TabS ...

  6. 《北风网网友录制Silverlight入门系列视频教程》共23课时/更新完毕[压缩包]

    中文名: 北风网网友录制Silverlight入门系列视频教程 资源格式: 压缩包 版本: 共23课时/更新完毕 发行日期: 2012年03月05日 地区: 大陆 对白语言: 普通话 文字语言: 简体 ...

  7. WPF快速入门系列(8)——MVVM快速入门

    一.引言 在前面介绍了WPF一些核心的内容,其中包括WPF布局.依赖属性.路由事件.绑定.命令.资源样式和模板.然而,在WPF还衍生出了一种很好的编程框架,即WVVM,在Web端开发有MVC,在WPF ...

  8. [Silverlight入门系列]实现局部元素全屏(Element部分全屏)

    本文不讨论Silverlight全屏模式的实现,有关实现这个,可以参考TerryLee的这篇文章,核心代码就是这行: Application.Current.Host.Content.IsFullSc ...

  9. [Silverlight入门系列]用TransformToVisual和Transform取得元素绝对位置(Location)

    在Silverlight的Layout中,控件往往是相对放置,例如Grid/Border/ListBox等,这个时候就是要取得子控件的绝对位置(location)怎么办?使用场景很多,例如,我们点击一 ...

最新文章

  1. get_sheet_of_light_result_object_model_3d算子说明
  2. log4j中调试与错误日志分开_idea中log4j日志插件报错
  3. 初探 MySQL 的 Binlog
  4. pycharm提示:Usually first parameter of a method is named 'self'
  5. ios RunLoop 用法
  6. SpringCloud常见问题总结(一)
  7. SpringBoot-短信验证码-快速入门Demo(含redis)(手把手教你开通阿里云短信服务到写出个最终代码来)
  8. Java 汉字转拼音 Scala 汉字转拼音
  9. 网易严选宣布退出双11?
  10. 动态污点分析隐式流--动静结合的解决方法
  11. 让Linux脱胎换骨的标致桌面与主题
  12. 杜红超、彭志红担任BCF理事
  13. Python体重指数计算器源代码
  14. java去掉字符串的逗号_java – 从字符串数组中删除逗号
  15. 有证无车的程序猿如何查询档案编号、添加电子驾驶证(支付宝、微信)
  16. OllyDebug破解第一个 CM 程序 《Acid burn.exe》
  17. pimple学习(1)pimple的使用
  18. 坚果O1S画面竟然出现折边?对比同价位当贝D3X,坚果O1S值得入手吗?
  19. 超几何分布与二项分布及其期望
  20. cuda编译错误 ptxas fatal : Unresolved extern function xxxx

热门文章

  1. c++强大还是python强大-C/C++和Python哪个更有前景?
  2. python画动图-利用Python如何制作好玩的GIF动图详解
  3. 学python可以干嘛-学完Python可以做什么?
  4. pythonweb开发-PythonWeb开发教程(一),开发之前需要准备什么
  5. python快速编程入门课后简答题答案-编程python入门 编程python入门课后习题
  6. python自学流程-各个阶段的python学习路线?
  7. python简单代码hello-python教程——【1 hello, python】
  8. python资料百度网盘-python自动保存百度盘资源到百度盘中的实例代码
  9. python读取csv文件制图-python读取CSV文件
  10. python朋友圈为什么这么火-利用Python让你的微信朋友圈与众不同,更加高大上