MVVM模式的View与ViewModel的三大通讯方式:Binding Data(实现数据的传递)、Command(实现操作的调用)和Attached
Behavior(实现控件加载过程中的操作)。
 
下面通过一个实例实现MVVM模式的Attached Behavior通讯,Attached Behavior与Command的区别就是,Attached Behavior在控件的加载过程中完成它的任务。
下面看一下实例的运行效果:

 

 

(1)MainPage.xaml页面代码,View层

 

 
  
  1. <phone:PhoneApplicationPage   
  2.     x:Class="AttachedBehaviorDemo.MainPage" 
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  5.     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
  6.     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
  7.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  8.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  9.     xmlns:local="clr-namespace:AttachedBehaviorDemo"   
  10.     mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
  11.     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
  12.     FontSize="{StaticResource PhoneFontSizeNormal}" 
  13.     Foreground="{StaticResource PhoneForegroundBrush}" 
  14.     SupportedOrientations="Portrait" Orientation="Portrait" 
  15.     shell:SystemTray.IsVisible="True"> 
  16.  
  17.     <Grid x:Name="LayoutRoot" Background="Transparent"> 
  18.         <Grid.RowDefinitions> 
  19.             <RowDefinition Height="Auto"/> 
  20.             <RowDefinition Height="*"/> 
  21.         </Grid.RowDefinitions> 
  22.  
  23.         <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
  24.             <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 
  25.             <TextBlock x:Name="PageTitle" Text="AttachedBehavior" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
  26.         </StackPanel> 
  27.  
  28.         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
  29.             <TextBlock FontSize="50" Text="金色 Gold" local:Behavior.Brush="Gold" Margin="0,6,0,504" /> 
  30.             <TextBlock FontSize="50"  Text="绿色 Green" local:Behavior.Brush="Green" Margin="0,94,0,416" /> 
  31.             <TextBlock FontSize="50"  Text="蓝色 Blue" local:Behavior.Brush="Blue" Margin="0,184,0,339" /> 
  32.             <TextBlock FontSize="50"  Text="橙色 Orange" local:Behavior.Brush="Orange" Margin="-3,274,3,243" /> 
  33.             <TextBlock FontSize="50"  Text="紫色 Purple" local:Behavior.Brush="Purple" Margin="0,386,0,133" /> 
  34.             <TextBlock FontSize="50"  Text="橄榄色 Olive" local:Behavior.Brush="Olive" Margin="0,497,0,0" Height="110" VerticalAlignment="Top" /> 
  35.         </Grid> 
  36.     </Grid> 
  37.       
  38. </phone:PhoneApplicationPage> 

(2)Behavior.cs类代码,处理附加的属性和事件。

 

 
  
  1. using System.Windows;  
  2. using System.Windows.Controls;  
  3. using System.Windows.Input;  
  4. using System.Windows.Media;  
  5.  
  6. namespace AttachedBehaviorDemo  
  7. {  
  8.     static public class Behavior  
  9.     {  
  10.         //注册一个附加属性BrushProperty,在XAML中名字为Brush,是Brush类型,在Hover类中,PropertyMetadata初始化元数据  
  11.         public static readonly DependencyProperty BrushProperty = DependencyProperty.RegisterAttached(  
  12.             "Brush",  
  13.             typeof(Brush),  
  14.             typeof(Behavior),  
  15.             new  PropertyMetadata (null, new PropertyChangedCallback(OnHoverBrushChanged)));  
  16.  
  17.         /// <summary> 
  18.         /// 获取Brush的属性值  
  19.         /// </summary> 
  20.         /// <param name="obj"></param> 
  21.         /// <returns></returns> 
  22.         public static Brush GetBrush(DependencyObject obj)  
  23.         {  
  24.             return (Brush)obj.GetValue(BrushProperty);  
  25.         }  
  26.         /// <summary> 
  27.         /// 设置属性的值  
  28.         /// </summary> 
  29.         /// <param name="obj"></param> 
  30.         /// <param name="value"></param> 
  31.         public static void SetBrush(DependencyObject obj, Brush value)  
  32.         {  
  33.             obj.SetValue(BrushProperty, value);  
  34.         }  
  35.         /// <summary> 
  36.         /// 属性初始化  
  37.         /// </summary> 
  38.         /// <param name="obj"></param> 
  39.         /// <param name="args"></param> 
  40.         private static void OnHoverBrushChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)  
  41.         {  
  42.             //获取属性所在的TextBlock控件  
  43.             TextBlock control = obj as TextBlock;  
  44.             //注册控件的事件  
  45.             if (control != null)  
  46.             {  
  47.                 //注册鼠标进入事件  
  48.                 control.MouseEnter += new MouseEventHandler(OnControlEnter);  
  49.                 //注册鼠标离开事件  
  50.                 control.MouseLeave += new MouseEventHandler(OnControlLeave);  
  51.             }  
  52.  
  53.         }  
  54.         /// <summary> 
  55.         /// 鼠标进入事件  
  56.         /// </summary> 
  57.         /// <param name="sender"></param> 
  58.         /// <param name="e"></param> 
  59.         static void OnControlEnter(object sender, MouseEventArgs e)  
  60.         {  
  61.             //获取当前的TextBlock控件  
  62.             TextBlock control = (TextBlock)e.OriginalSource;   
  63.             //设置控件的前景颜色为红色  
  64.             control.Foreground = new SolidColorBrush(Colors.Red);  
  65.         }  
  66.  
  67.         /// <summary> 
  68.         /// 鼠标离开事件  
  69.         /// </summary> 
  70.         /// <param name="sender"></param> 
  71.         /// <param name="e"></param> 
  72.         static void OnControlLeave(object sender, MouseEventArgs e)  
  73.         {  
  74.             //获取当前的TextBlock控件  
  75.             TextBlock control = (TextBlock)e.OriginalSource;  
  76.             //设置控件的前景颜色为当前控件的Brush属性的值  
  77.             control.Foreground = GetBrush(control);  
  78.         }   
  79.  
  80.     }