MVVMモードにおけるViewModelにおけるICommandの応用

5997 ワード

MVVMはwpf,sliverlight,window phoneで開発に役立ち、
最近このブロ友の文章を勉強しました.
この記事は主に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コントロールを簡単に追加
 
ビューページの後置コードで
単純なViewModelのインスタンス化
 PersonViewModel personView = new PersonViewModel();現在のページのデータコンテキストをViewmodelに関連付ける
this.DataContext = personView;
その後、View ModelとViewがバインドされ、View ModelのTestCommandコマンドがページ上のButtonボタンにバインドされます.
シミュレータを実行し、ボタンをクリックするとTestCommandコマンドが実行され、「hello world」ダイアログボックスが表示されます
 
コントロールにCommand属性がない場合は、Commandイベントをバインドするためにバックコードでコードを使用する必要があります.CanExecuteがfalseに戻ると、ボタンコントロールは使用できないグレーの効果を示します.