在silverlight一般开发模式中,给文本框添加一些事件是轻而易举的,然而MVVM开发模式中,想要给文本框添加一些事件并非那么容易,因为MVVM模式中,只有ICommand接口,而且也只有Button中才有Command属性,通过ViewModel可以将方法绑定到Button上面,却无法绑定到文本框和其他一些控件。、

  Behavior的出现解决了这一难题,下面就来说一下具体的实现方法:

  实例一:在用户登录窗口,用户点击Reset按钮后,让用户名输入框自动获取焦点。

  首先要先将ViewModel绑定到我们的控件上面,我们一步一步来做,第一步先写Model,下面是Model的代码:

  

using System;
using System.Net;
using System.Runtime.Serialization;
using System.ComponentModel;

namespace BookModel
{
   [DataContract]
   public class UserModel : INotifyPropertyChanged
   {
      public event PropertyChangedEventHandler PropertyChanged;

      private string userName = String.Empty;
      private string passWord = String.Empty;

      [DataMember]
      public string UserName
      {
         get { return userName; }
         set { userName = value; OnPropertyChanged("UserName"); }
      }

      [DataMember]
      public string PassWord
      {
         get { return passWord; }
         set { passWord = value; OnPropertyChanged("PassWord"); }
      }

      /// <summary>
      /// Call the event PropertyChanged.
      /// </summary>
      /// <param name="PropertyName"></param>
      public void OnPropertyChanged(string PropertyName)
      {
         if (PropertyChanged != null)
         {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
         }
      }
   }
}

 

  写完了Model,下一步就是写ViewModel了,在ViewModel中引用Model的命名控件,下面是ViewModel的代码,例子比较简单,就不多解释了。

  

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using BookModel;
using System.Windows.Browser;

namespace BookViewModel
{
   public class VM_User
   {
      /// <summary>
      /// In the Constructors create the instance of User.
      /// </summary>
      public VM_User()
      {
         user = new UserModel();
         user.UserName = "Jack";
      }

      public UserModel user { get; set; }
      public LoginCommand Login
      {
         get { return new LoginCommand(); }
      }
      public ResteCommand Reset
      {
         get { return new ResteCommand(); }
      }
   }

   /// <summary>
   /// Login Button's method
   /// </summary>
   public class LoginCommand:ICommand
   {
      public bool CanExecute(object parameter)
      {
         return true;
      }

      public void Execute(object parameter)
      {
         VM_User VMUser = parameter as VM_User;
         if (VMUser.user.UserName.Equals("admin") && VMUser.user.PassWord.Equals("123"))
         {
            MessageBox.Show("Login success!", "System Info", MessageBoxButton.OK);
         }
         else
         {
            MessageBox.Show("Login failed!", "System Info", MessageBoxButton.OK);
         }
      }

      public event EventHandler CanExecuteChanged;
   }

   /// <summary>
   /// Reset buttom's method
   /// </summary>
   public class ResteCommand : ICommand
   {
      public bool CanExecute(object parameter)
      {
         return true;
      }

      public void Execute(object parameter)
      {
         VM_User VMUser = parameter as VM_User;
         VMUser.user.UserName = "";
         VMUser.user.PassWord = "";
      }
      public event EventHandler CanExecuteChanged;
   }
}
View Code

相关文章: