MVVM在wpf,sliverlight,window phone中開發中作用很不錯,
最近學習了這個博友的文章,sliverlight中使用mvvm。
這個文章主要記錄如何在ViewModel中使用ICommand
Icommand定義如下:
namespace System.Windows.Input
{
// 摘要:
// 為命令定義協定。
public interface ICommand
{
// 摘要:
// 當出現影響是否應執行該命令的更改時發生。
event EventHandler CanExecuteChanged;
// 摘要:
// 定義用於確定此命令是否可以在其當前狀態下執行的方法。
//
// 參數:
// parameter:
// 此命令使用的數據。如果此命令不需要傳遞數據,則該對象可以設置為 null。
//
// 返回結果:
// 如果此命令可以執行,則為 true;否則為 false。
bool CanExecute(object parameter);
//
// 摘要:
// 定義在調用此命令時調用的方法。
//
// 參數:
// parameter:
// 此命令使用的數據。如果此命令不需要傳遞數據,則該對象可以設置為 null。
void Execute(object parameter);
}
}
自定義一個RelayCommand類,繼承ICommand類
public class RelayCommand : ICommand
{
private Action _handler;
//Action是一個委托方法,所有的放到都可以傳遞進來,在Execute中執行。
public RelayCommand(Action handler)
{
this._handler = handler;
}
//如果返回false,綁定的控件就會呈現不可使用的效果
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
_handler();
}
}
定義ViewModel,使用ICommand
public class PersonViewModel
{
public List<Person> Human { get; set; }
public PersonViewModel()
{
Human = new Persons().getPerson();
}
private ICommand _testCommand;
public ICommand TestCommand
{
get
{
return _testCommand = new RelayCommand(TestMethod);//或者執行使用delegate方式寫方法代碼,不用傳方法名
}
}
public void TestMethod()
{
MessageBox.Show("hello world");
}
}
在View頁面簡單的添加一個Button控件
<Button Name="btnTest" Content="Button Test" Command="{Binding TestCommand}"></Button>
在View頁面的后置代碼中
簡單的實例化一個ViewModel
PersonViewModel personView = new PersonViewModel();
把當前頁面的數據上下文和Viewmodel關聯
this.DataContext = personView;
然后ViewModel和View就綁定好,ViewModel中的TestCommand命令就和頁面上Button按鈕綁定到了一起
運行模擬器,點擊按鈕就會執行TestCommand命令,彈出“hello world”對話框
如果控件沒有Command屬性,那么需要在后置代碼中使用代碼來綁定Command事件
如果CanExecute返回false,就會發現按鈕控件呈現不可使用的灰色效果