Windows Phone 7 MVVM模式通讯方式之实现Command

来源:转载

MVVM模式的View与ViewModel的三大通讯方式:Binding

Data(实现数据的传递)、Command(实现操作的调用)和Attached Behavior(实现控件加载过程中的操作)。

下面通过一个实例实现MVVM模式的Command通讯

 

(1)MainPage.xaml文件的代码,实现View层

<phone:PhoneApplicationPage 

    x:Class="CommandDemo.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:my="clr-namespace:CommandDemo.ViewModel" 

    xmlns:my_Interactivity="clr-namespace:CommandDemo.Command" 

    xmlns:Custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 

    mc:Ignorable="d"d:DesignWidth="480"d:DesignHeight="768"

    FontFamily="{StaticResource PhoneFontFamilyNormal}"

    FontSize="{StaticResource PhoneFontSizeNormal}"

    Foreground="{StaticResource PhoneForegroundBrush}"

    SupportedOrientations="Portrait"Orientation="Portrait"

    shell:SystemTray.IsVisible="True">

    <!--设置整个页面的上下文数据DataContext为RadiusViewModel-->

    <phone:PhoneApplicationPage.DataContext>

        <my:RadiusViewModel/>

    </phone:PhoneApplicationPage.DataContext>

  

    <Gridx:Name="LayoutRoot"Background="Transparent">

        <Grid.RowDefinitions>

            <RowDefinitionHeight="Auto"/>

            <RowDefinitionHeight="*"/>

        </Grid.RowDefinitions>

  

        <StackPanelx:Name="TitlePanel"Grid.Row="0"Margin="12,17,0,28">

            <TextBlockx:Name="ApplicationTitle"Text="MY APPLICATION"Style="{StaticResource PhoneTextNormalStyle}"/>

            <TextBlockx:Name="PageTitle"Text="Command"Margin="9,-7,0,0"Style="{StaticResource PhoneTextTitle1Style}"/>

        </StackPanel>

  

  

        <Gridx:Name="ContentPanel"Grid.Row="1"Margin="12,0,12,0">

            <EllipseFill="Red" 

                     Height="{Binding Radius}"Width="{Binding Radius}" 

                     HorizontalAlignment="Left"Margin="119,84,0,0"Name="ellipse1"Stroke="Black"StrokeThickness="1"VerticalAlignment="Top"/>

            <ButtonContent="小"Height="72"HorizontalAlignment="Left"Margin="0,385,0,0"Name="button1"VerticalAlignment="Top"Width="160">

                <Custom:Interaction.Triggers>

                    <Custom:EventTriggerEventName="Click">

                        <my_Interactivity:ExecuteCommandActionCommandName="MinRadius"/>

                    </Custom:EventTrigger>

                </Custom:Interaction.Triggers>

            </Button>

            <ButtonContent="中"Height="72"HorizontalAlignment="Left"Margin="149,384,0,0"Name="button2"VerticalAlignment="Top"Width="160">

                <Custom:Interaction.Triggers>

                    <Custom:EventTriggerEventName="Click">

                        <my_Interactivity:ExecuteCommandActionCommandName="MedRadius"/>

                    </Custom:EventTrigger>

                </Custom:Interaction.Triggers>

            </Button>

            <ButtonContent="大"Height="72"HorizontalAlignment="Left"Margin="299,382,0,0"Name="button3"VerticalAlignment="Top"Width="160">

                <Custom:Interaction.Triggers>

                    <Custom:EventTriggerEventName="Click">

                        <my_Interactivity:ExecuteCommandAction  CommandName="MaxRadius"/>

                    </Custom:EventTrigger>

                </Custom:Interaction.Triggers>

            </Button>

        </Grid>

    </Grid>

  

</phone:PhoneApplicationPage>

(2)RadiusViewModel.cs文件的代码,实现ViewModel层

usingSystem;

usingSystem.Windows.Input;

usingSystem.ComponentModel;

usingMicrosoft.Expression.Interactivity.Core;

  

namespaceCommandDemo.ViewModel

{

    publicclassRadiusViewModel : INotifyPropertyChanged

    {

        privateDouble radius;

  

        publicRadiusViewModel()

        {

            Radius = 0;

            MinRadius = newActionCommand(p => Radius = 100);

            MedRadius = newActionCommand(p => Radius = 200);

            MaxRadius = newActionCommand(p => Radius = 300);

        }

  

        publiceventPropertyChangedEventHandler PropertyChanged;

  

        publicICommand MinRadius

        {

            get; privateset;

        }

  

        publicICommand MedRadius

        {

            get;

            privateset;

        }

  

        publicICommand MaxRadius

        {

            get;

            privateset;

        }

  

        publicDouble Radius

        {

            get

            {

                returnradius;

            }

            set

            {

                radius = value;

                OnPropertyChanged("Radius");

            }

        }

  

        protectedvirtualvoidOnPropertyChanged(stringpropertyName)

        {

            var propertyChanged = PropertyChanged;

  

            if(propertyChanged != null)

                propertyChanged(this, newPropertyChangedEventArgs(propertyName));

        }

    }

}

(3)ExecuteCommandAction.cs类,实现Command操作

using System;  

using System.Windows;  
using System.Windows.Input;  

using System.Windows.Interactivity;  

using System.Reflection;  

   

namespace CommandDemo.Command  

{  

    public class ExecuteCommandAction : TriggerAction<FrameworkElement>  

    {  

        public static readonly DependencyProperty CommandNameProperty =  

             DependencyProperty.Register("CommandName", typeof(string), typeof(ExecuteCommandAction), null);  

   

        public static readonly DependencyProperty CommandParameterProperty =  

            DependencyProperty.Register("CommandParameter", typeof(object), typeof(ExecuteCommandAction), null);  

   

        protected override void Invoke(object parameter)  

        {  

            if (AssociatedObject == null)  

                return;  

   

            ICommand command = null;  

   

            var dataContext = AssociatedObject.DataContext;  

   

            foreach (var info in dataContext.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))  

            {  

                if (IsCommandProperty(info) && String.Equals(info.Name, CommandName, StringComparison.Ordinal))  

                {  

                    command = (ICommand)info.GetValue(dataContext, null);  

                    break;  

                }  

            }  

   

            if ((command != null) && command.CanExecute(CommandParameter))  

            {  

                command.Execute(CommandParameter);  

            }  

        }  

   

        private static bool IsCommandProperty(PropertyInfo property)  

        {  

            return typeof(ICommand).IsAssignableFrom(property.PropertyType);  

        }  

   

        public string CommandName  

        {  

            get 

            {  

                return (string)GetValue(CommandNameProperty);  

            }  

            set 

            {  

                SetValue(CommandNameProperty, value);  

            }  

        }  

   

        public object CommandParameter  

        {  

            get 

            {  

                return GetValue(CommandParameterProperty);  

            }  

            set 

            {  

                SetValue(CommandParameterProperty, value);  

            }  

        }  

    }  

本文来自linzheng的博客,原文地址:http://www.cnblogs.com/linzheng/archive/2011/06/18/2084246.html


分享给朋友:
您可能感兴趣的文章:
随机阅读: