Ò»£¬MVVMÀíÂÛ֪ʶ
¡¡¡¡´ÓÉÏһƪÎÄÕÂÖУ¬ÎÒÃÇÒѾ֪µÀ£¬WPF¼¼ÊõµÄÖ÷ÒªÌØµãÊÇÊý¾ÝÇý¶¯UI,ËùÒÔÔÚʹÓÃWPF¼¼Êõ¿ª·¢µÄ¹ý³ÌÖÐÊÇÒÔÊý¾ÝΪºËÐĵģ¬WPFÌṩÁËÊý¾Ý°ó¶¨»úÖÆ£¬µ±Êý¾Ý·¢Éú±ä»¯Ê±£¬WPF»á×Ô¶¯·¢³ö֪ͨȥ¸üÐÂUI¡£
ÎÒÃÇʹÓÃģʽ£¬Ò»°ãÊÇÏë´ïµ½¸ßÄÚ¾ÛµÍñîºÏ¡£ÔÚWPF¿ª·¢ÖУ¬¾µäµÄ±à³ÌģʽÊÇMVVM£¬ÊÇΪWPFÁ¿Éí¶¨×öµÄģʽ£¬¸Ãģʽ³ä·ÖÀûÓÃÁËWPFµÄÊý¾Ý°ó¶¨»úÖÆ£¬×î´óÏ޶ȵؽµµÍÁËXmalÎļþºÍCSÎļþµÄñîºÏ¶È£¬Ò²¾ÍÊÇUIÏÔʾºÍÂß¼´úÂëµÄñîºÏ¶È£¬ÈçÐèÒª¸ü»»½çÃæÊ±£¬Âß¼´úÂëÐ޸ĺÜÉÙ£¬ÉõÖÁ²»ÓÃÐ޸ġ£ÓëWinForm¿ª·¢Ïà±È£¬ÎÒÃÇÒ»°ãÔÚºóÖôúÂëÖлáʹÓÿؼþµÄÃû×ÖÀ´²Ù×÷¿Ø¼þµÄÊôÐÔÀ´¸üÐÂUI£¬¶øÔÚWPFÖÐͨ³£ÊÇͨ¹ýÊý¾Ý°ó¶¨À´¸üÐÂUI£»ÔÚÏìÓ¦Óû§²Ù×÷ÉÏ£¬WinFormÊÇͨ¹ý¿Ø¼þµÄʼþÀ´´¦Àí£¬¶øWPF¿ÉÒÔʹÓÃÃüÁî°ó¶¨µÄ·½Ê½À´´¦Àí£¬ñîºÏ¶È½«½µµÍ¡£
ÎÒÃÇ¿ÉÒÔͨ¹ýÏÂͼÀ´Ö±¹ÛµÄÀí½âMVVMģʽ£º¡¡¡¡

View¾ÍÊÇÓÃxamlʵÏֵĽçÃæ£¬¸ºÔðÓëÓû§½»»¥£¬½ÓÊÕÓû§ÊäÈ룬°ÑÊý¾ÝÕ¹ÏÖ¸øÓû§¡£
ViewModel£¬Ò»¸öC#À࣬¸ºÔðÊÕ¼¯ÐèÒª°ó¶¨µÄÊý¾ÝºÍÃüÁ¾ÛºÏModel¶ÔÏó£¬Í¨¹ýViewÀàµÄDataContextÊôÐ԰󶨵½View£¬Í¬Ê±Ò²¿ÉÒÔ´¦ÀíһЩUIÂß¼¡£
Model£¬¾ÍÊÇϵͳÖеĶÔÏ󣬿ɰüº¬ÊôÐÔºÍÐÐΪ¡£
Ò»°ã£¬View¶ÔÓ¦Ò»¸öViewModel£¬ViewModel¿ÉÒÔ¾ÛºÏN¸öModel£¬ViewModel¿ÉÒÔ¶ÔÓ¦¶à¸öView,Model²»ÖªµÀViewºÍViewModelµÄ´æÔÚ¡£
¶þ£¬MVVMʾÀý½²½â
Õâ¸öʾÀýÊÇΪÁËÈôó¼ÒÖ±¹ÛµØÁ˽âMVVMµÄ±à³Ìģʽ£¬¹ØÓÚÆäÖÐÓõ½µÄÊý¾Ý°ó¶¨ºÍÃüÁîµÈ֪ʶ£¬ÔÚºóÃæµÄÎÄÕ»áרÃÅÌÖÂÛ¡£
1.Ê×Ïȶ¨ÒåNotificationObjectÀà¡£
Ä¿µÄÊǰó¶¨Êý¾ÝÊôÐÔ¡£Õâ¸öÀàµÄ×÷ÓÃÊÇʵÏÖÁËINotifyPropertyChanged½Ó¿Ú¡£WPFÖÐÀàҪʵÏÖÕâ¸ö½Ó¿Ú£¬ÆäÊôÐÔ³ÉÔ±²Å¾ß±¸Í¨ÖªUIµÄÄÜÁ¦£¬Êý¾Ý°ó¶¨µÄ֪ʶ£¬ºóÃæÏêϸÌÖÂÛ¡£
using System.ComponentModel;
namespace WpfFirst
{
class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
|
2.¶¨ÒåDelegateCommandÀà¡£
Ä¿µÄÊǰó¶¨ÃüÁîÊôÐÔ¡£Õâ¸öÀàµÄ×÷ÓÃÊÇʵÏÖÁËICommand½Ó¿Ú£¬WPFÖÐʵÏÖÁËICommand½Ó¿ÚµÄÀ࣬²ÅÄÜ×÷ΪÃüÁî°ó¶¨µ½UI¡£ÃüÁîµÄ֪ʶ£¬ºóÃæÏêϸÌÖÂÛ¡£
using System; using System.Collections.Generic; using System.Windows.Input;
namespace WpfFirst
{
class DelegateCommand : ICommand
{
//A method prototype without return value.
public Action<object> ExecuteCommand = null;
//A method prototype return a bool type.
public Func<object, bool> CanExecuteCommand
= null;
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
if (CanExecuteCommand != null)
{
return this.CanExecuteCommand(parameter);
}
else
{
return true;
}
}
public void Execute(object parameter)
{
if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
} |
3.¿ªÊ¼¶¨ÒåModelÀà¡£
Ò»¸öÊôÐÔ³ÉÔ±"WPF",Ëü¾ÍÊÇÊý¾ÝÊôÐÔ£¬µÄÓÐ֪ͨ¹¦ÄÜ£¬Ëü¸Ä±äºó£¬»áÖªµÀ֪ͨUI¸üС£Ò»¸ö·½·¨¡°Copy¡±,ÓÃÀ´¸Ä±äÊôÐÔ¡°WPF¡±µÄÖµ£¬Ëüͨ¹ýÃüÁîµÄ·½Ê½ÏàÓ¦UIʼþ¡£
using System.ComponentModel;
using System.Windows.Input;
namespace WpfFirst
{
class Model : NotificationObject
{
private string _wpf = "WPF";
public string WPF
{
get { return _wpf; }
set
{
_wpf = value;
this.RaisePropertyChanged("WPF");
}
}
public void Copy(object obj)
{
this.WPF += " WPF";
}
}
}
|
4.¶¨ÒåViewModelÀà¡£
¶¨ÒåÁËÒ»¸öÃüÁîÊôÐÔ"CopyCmd"£¬¾ÛºÏÁËÒ»¸öModel¶ÔÏó"model"¡£ÕâÀïµÄ¹Ø¼üÊÇ£¬¸øCopyCmdÃüÁîÖ¸¶¨ÏìÓ¦ÃüÁîµÄ·½·¨ÊÇmodel¶ÔÏóµÄ¡°Copy¡±·½·¨¡£
using System; namespace WpfFirst { class ViewModel { public DelegateCommand CopyCmd { get; set; } public Model model { get; set; }
public ViewModel()
{
this.model = new Model();
this.CopyCmd = new DelegateCommand();
this.CopyCmd.ExecuteCommand = new Action<object>(this.model.Copy);
}
}
} |
5.¶¨ÒåView
MainWindow.xaml´úÂ룺ÎÒÃÇÄÜ¿´µ½£¬TextBlock¿Ø¼þµÄtextÊôÐÔ£¬°ó¶¨ÔÚmodel¶ÔÏóµÄWPFÊôÐÔÉÏ;
ButtonµÄclickʼþͨ¹ýÃüÁî°ó¶¨µ½CopyCmdÃüÁîÊôÐÔ¡£¡¡
<Window x:Class="WpfFirst.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <StackPanel VerticalAlignment="Center" > <TextBlock Text="{Binding model.WPF}" Height="208" TextWrapping="WrapWithOverflow"></TextBlock> <Button Command="{Binding CopyCmd}" Height="93" Width="232">Copy</Button> </StackPanel> </Grid> </Window> |
MainWindow.xaml.cs´úÂë:ËüµÄ¹¤×÷֪ʶ°ÑViewModel¶ÔÏó¸³Öµµ½DataContextÊôÐÔ£¬Ö¸¶¨ViewµÄÊý¾ÝÔ´¾ÍÊÇÕâ¸öViewModel¡£
using System.Windows;
namespace WpfFirst
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
}
|
6.ÔËÐнá¹û¡£
ÿµ±ÎÒÃǵã»÷°´Å¥£¬½çÃæ¾ÍÊDZ»¸üÐÂÁË£¬ÒòΪCopy·½·¨¸Ä±äÁËWFPÊôÐÔµÄÖµ¡£¡¡¡¡

дÕâ¸ö¼òµ¥µÄÀý×Ó£¬¾ÍÊÇΪÁËÖ±¹ÛµØÁ˽âMVVMµÄ±à³Ìģʽ¡£ÔÚʵ¼Ê¿ª·¢ÖУ¬²»¹Ü³ÌÐòÓжิÔÓ£¬Ò²¾ÍÊÇÔö¼ÓModel,
View, ViewModel£¬ºÍÆäËûµÄһЩ¸¨ÖúÀࣨHelpers or Services£©ÁË£¬Ä£Ê½²»»á¸Ä±ä¡£
|