在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; } }