Windows Phone 7 MVVM模式通訊方式之實現Command
MVVM模式的View與ViewModel的三大通訊方式:Binding Data(實現資料的傳遞)、Command(實現操作的呼叫)和Attached Behavior(實現控制元件載入過程中的操作)。
(1)MainPage.xaml檔案的程式碼,實現View層
< phone:PhoneApplicationPage x:Class = "CommandDemo.MainPage" xmlns:phone = "clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell = "clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 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 > < Grid x:Name = "LayoutRoot" Background = "Transparent" > < Grid.RowDefinitions > < RowDefinition Height = "Auto" /> < RowDefinition Height = "*" /> </ Grid.RowDefinitions > < StackPanel x:Name = "TitlePanel" Grid.Row = "0" Margin = "12,17,0,28" > < TextBlock x:Name = "ApplicationTitle" Text = "MY
APPLICATION" Style = "{StaticResource
PhoneTextNormalStyle}" /> < TextBlock x:Name = "PageTitle" Text = "Command" Margin = "9,-7,0,0" Style = "{StaticResource
PhoneTextTitle1Style}" /> </ StackPanel > < Grid x:Name = "ContentPanel" Grid.Row = "1" Margin = "12,0,12,0" > < Ellipse Fill = "Red" Height = "{Binding
Radius}" Width = "{Binding
Radius}" HorizontalAlignment = "Left" Margin = "119,84,0,0" Name = "ellipse1" Stroke = "Black" StrokeThickness = "1" VerticalAlignment = "Top" /> < Button Content = "小" Height = "72" HorizontalAlignment = "Left" Margin = "0,385,0,0" Name = "button1" VerticalAlignment = "Top" Width = "160" > < Custom:Interaction.Triggers > < Custom:EventTrigger EventName = "Click" > < my_Interactivity:ExecuteCommandAction CommandName = "MinRadius" /> </ Custom:EventTrigger > </ Custom:Interaction.Triggers > </ Button > < Button Content = "中" Height = "72" HorizontalAlignment = "Left" Margin = "149,384,0,0" Name = "button2" VerticalAlignment = "Top" Width = "160" > < Custom:Interaction.Triggers > < Custom:EventTrigger EventName = "Click" > < my_Interactivity:ExecuteCommandAction CommandName = "MedRadius" /> </ Custom:EventTrigger > </ Custom:Interaction.Triggers > </ Button > < Button Content = "大" Height = "72" HorizontalAlignment = "Left" Margin = "299,382,0,0" Name = "button3" VerticalAlignment = "Top" Width = "160" > < Custom:Interaction.Triggers > < Custom:EventTrigger EventName = "Click" > < my_Interactivity:ExecuteCommandAction CommandName = "MaxRadius" /> </ Custom:EventTrigger > </ Custom:Interaction.Triggers > </ Button > </ Grid > </ Grid > </ phone:PhoneApplicationPage > |
(2)RadiusViewModel.cs檔案的程式碼,實現ViewModel層
using System; using System.Windows.Input; using System.ComponentModel; using Microsoft.Expression.Interactivity.Core; namespace CommandDemo.ViewModel { public class RadiusViewModel
: INotifyPropertyChanged { private Double
radius; public RadiusViewModel() { Radius
= 0; MinRadius
= new ActionCommand(p
=> Radius = 100); MedRadius
= new ActionCommand(p
=> Radius = 200); MaxRadius
= new ActionCommand(p
=> Radius = 300); } public event PropertyChangedEventHandler
PropertyChanged; public ICommand
MinRadius { get ;
private set ; } public ICommand
MedRadius { get ; private set ; } public ICommand
MaxRadius { get ; private set ; } public Double
Radius { get { return radius; } set { radius
= value; OnPropertyChanged( "Radius" ); } } protected virtual void OnPropertyChanged( string propertyName) { var
propertyChanged = PropertyChanged; if (propertyChanged
!= null ) propertyChanged( this ,
new PropertyChangedEventArgs(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); } } } } |
相關文章
- Windows Phone 7 MVVM模式通訊方式之實現Binding DataWindowsMVVM模式
- Silverlight/WPF/Windows Phone 開發之MVVM設計模式之入門WindowsMVVM設計模式
- Windows Phone7 實現檔案上傳Windows
- MVVM模式解析和在WPF中的實現(五)View和ViewModel的通訊MVVM模式View
- Windows Phone7開發系列視訊地址Windows
- 【轉】【WPF】MVVM模式的3種commandMVVM模式
- MVVM模式和在WPF中的實現(一)MVVM模式簡介MVVM模式
- Windows Phone 7 墓碑機制Windows
- Windows Phone 7程式設計Windows程式設計
- windows下程式間通訊的方式Windows
- HTML Agility Pack for Windows Phone 7 (WP7)HTMLWindows
- 淺探VUE的MVVM模式實現VueMVVM模式
- Windows Phone 7解析圖片格式Windows
- Activity之間的通訊方式
- iOS app之間通訊方式iOSAPP
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- Windows Phone 專案實戰之部落格園Windows
- WPF中以MVVM方式,實現RTSP影片播放MVVM
- 實現不同程式之間的通訊
- 《Windows Phone 7入門經典之使用Silverlight和XNA開發Windows Phone應用》書評Windows
- MVVM模式解析和在WPF中的實現(六) 用依賴注入的方式配置ViewModel並註冊訊息MVVM模式依賴注入View
- Windows程式間各種通訊方式淺談Windows
- 一起學Windows Phone7開發(十四.一 Phone Task)Windows
- 微服務通訊之ribbon實現原理微服務
- Windows Phone 7 開發 31 日談——第21日:Silverlight Toolkit for Windows PhoneWindows
- Windows Phone 7 點陣圖程式設計Windows程式設計
- Windows Phone 7 SIM卡資訊獲取Windows
- 微服務7:通訊之RPC微服務RPC
- React中元件之間通訊的方式React元件
- Windows Phone 專案實戰之賬戶助手升級Windows
- Command(命令)——物件行為型模式(通過Command設計模式實現WinForm表單維護的撤銷與重做功能)物件設計模式ORM
- 網路通訊2:TCP通訊實現TCP
- MVVM模式到底是什麼?實現原理剖析MVVM模式
- 程序通訊方式
- 8┃音視訊直播系統之 WebRTC 信令系統實現以及通訊核心並實現視訊通話Web
- 在如何實現兩個JBoss之間的訊息通訊?
- Spartacus 使用 Command 設計模式之後對以前 Connector 實現的重用設計模式
- RabbitMQ實戰:訊息通訊模式和最佳實踐MQ模式