這個概念是你將一個命令綁定到一個按鈕上,該命令驅動這個按鈕的兩個屬性:「點擊」和「啓用」,導致你發佈的界面。
您想要執行命令的主要原因是能夠將按鈕點擊綁定到視圖模型中的操作。
如果您創建一個將操作作爲構造函數參數的自定義命令,則可以將視圖模型中的方法直接連接到您的命令。在您的視圖模型
public class RelayCommand: ICommandd
{
Action action;
Func<bool> canExecute;
public RelayCommand(Action action) : this(action,() => true) {}
public RelayCommand(Action action, Func<bool> canExecute)
{
this.action = action;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute();
}
public void Execute(object parameter)
{
action();
}
}
用法是
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave);
public void Save()
{
// save logic...
}
如果你想連線CanExecute,也可以使用第二個構造函數,並提供CanSave方法。
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave, CanSave);
public void Save()
{
// save logic...
}
public bool CanSave()
{
return // ...
}
正如你可能注意到我在我的實現中刪除了命令參數。這在大多數情況下是足夠的,並且可以在你的處理器方法中保存額外的參數。對於10%左右我實現了一個RelayCommand<T>
這需要一個行動,而不是行動和改變Execute
方法
public void Execute(object parameter)
{
action((T)parameter);
}
這需要一個參數化處理
SaveCommand = new RelayCommand<SomeType>(OnSave);
public void Save(SomeType toSave)
{
// save logic using parameter
}
這樣可以節省你遇到的時候所有鑄造的問題使用object
變量並保持您的視圖模型類型安全。
這的確是這樣做的命令非常有用的方式,尤其是對MV-VM架構,但不幸的是,這不是我很是什麼尋找,如果你閱讀上面,我實際上是想分開我的觀點的所有邏輯,我有這樣做的具體原因,我實際上找到了我在這裏找的是什麼http://www.codeproject.com/KB /WPF/CentralizingWPFCommands.aspx?display=Print - Upvote爲你的好例子,謝謝! – TheJediCowboy 2011-03-20 20:44:32
即使您想通過靜態類提供您的命令,我也會推薦使用RelayCommands。這樣你就不需要代碼爲你的xaml文件和'_DeleteContact = new RoutedUICommand(「Delete a existing contact」,「DeleteContact」,typeof(MyAppCommands));'包含可能改變和阻礙重構的硬編碼字符串。我會對你的用例感興趣。爲什麼你想把所有的命令放到一個靜態類中? – Zebi 2011-03-20 21:38:17