Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
WPF¾­µä±à³Ìģʽ-MVVMʾÀý½²½â
 
×÷Õß zchunhua520µÄ²©¿Í £¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-11-26
  5080  次浏览      27
 

Ò»£¬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£©ÁË£¬Ä£Ê½²»»á¸Ä±ä¡£

   
5080 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆÄ£Ê½Ëæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼ÆÄ£Ê½-½éÉÜ
.NETÖеÄÉè¼ÆÄ£Ê½
Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆÄ£Ê½Ö¸ÄÏ
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Éè¼ÆÄ£Ê½¼°ÆäCSharpʵÏÖ

ijµçÁ¦¹«Ë¾ Éè¼ÆÄ£Ê½Ô­Àí
À¶ÍØÆË Éè¼ÆÄ£Ê½Ô­Àí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­Àí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
 
 
 
¡¡