我嘗試在MVVM模式下使用命令,但我不知道如何將命令「綁定」到特殊事件,例如, MouseUp或MouseEnter。這個怎麼做?MVVM - 關於特殊事件的命令
回答
首先,您應該在ViewModel
中定義ICommnad
屬性。
public ICommand MouseUpCommand
{
get
{
if (this.mouseUpCommand == null)
{
this.mouseUpCommand = new RelayCommand(this.OnMouseUp);
}
return this.mouseUpCommand;
}
}
private void OnMouseUp()
{
// Handle MouseUp event.
}
你可以找到很多ICommand
實現。其中之一:
public class RelayCommand : ICommand
{
public RelayCommand(Action<object> execute)
{
this._execute = execute;
...
}
...
public void Execute(object parameter)
{
_execute(parameter);
}
}
然後添加事件觸發其內調用您Command
:
<i:EventTrigger EventName="MouseUp">
<i:InvokeCommandAction Command="{Binding MouseUpCommand}"/>
</i:EventTrigger>
如果我不使用ICOMMAND,relaycommand和just在各自視圖文件後面的代碼中聲明mousedown,那可以認爲是MVVM實現嗎? –
@Sangram No.任何時候你使用代碼 - 這不是合適的MVVM。顯然,沒有'ViewModel'就不能有MVVM。 –
@AnatoliiG,這是絕對的廢話 - MVVM的目的是爲了減少代碼背後,但說背後的代碼=不是MVVM是不正確的。請參閱http://channel9.msdn.com/blogs/kreekman/techdays-2010-understanding-the-model-view-viewmodel-pattern at 01:01:00 –
閱讀EventToCommand在以下page,請
看WPF Binding UI events to commands in ViewModel。
爲此,您需要System.Windows.Interactivity.dll
你可以從Nuget
拿到這裏完成@AnatoliiG郵政的實現和RelayCommand
類的一個示例使用。
代碼:
public class RelayCommand : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute(parameter);
}
#endregion // ICommand Members
}
用法:
// To use this class within your viewmodel class:
RelayCommand _myCommand;
public ICommand MyCommand
{
get
{
if (_myCommand == null)
{
_myCommand = new RelayCommand(p => this.DoMyCommand(p),
p => this.CanDoMyCommand(p));
}
return _myCommand;
}
}
- 1. WPF MVVM事件命令 - 基於事件參數調用命令
- 2. 事件而不是MVVM中的命令?
- 3. MVVM:按鈕保持事件的命令
- 4. WPF MVVM:綁定命令到事件
- 5. MVVM查看事件Viewmodel命令綁定
- 6. top命令特殊字符
- 7. Silverlight命令MVVM
- 8. 最終記錄的特殊AWK命令
- 9. 帶特殊字符的tr命令
- 10. 用於粘貼特殊的Lotus @命令腳本 - >文本
- 11. 用於刪除特殊字符的MySQL命令
- 12. 將WPFToolkit DataGrid的事件綁定到ModelView的命令(MVVM)
- 13. 路由事件和命令
- 14. MVVM Light:將事件綁定到後面代碼中的命令
- 15. 對於特定文件的「FOR」命令?
- 16. 關於grep命令
- 17. 關於egrep命令
- 18. 關於Linux命令
- 19. 遞歸grep命令特殊字符
- 20. UNIX cal命令特殊字符
- 21. sed命令有許多特殊字符
- 22. 命令到powershell替換 - 特殊字符
- 23. Grep命令被特殊字符逆轉?
- 24. 從命令行傳遞特殊字符
- 25. Ansible shell命令-a帶特殊字符「
- 26. jQuery特殊事件API
- 27. MVVM命令錯誤
- 28. MVVM命令綁定
- 29. 綁定命令MVVM
- 30. 命令綁定MVVM
使用'從MVVM光EventToCommand'行爲:http://www.galasoft.ch/mvvm/ – Bolu
如果你不想使用MVVM Light,Blend具有類似的行爲。 – Tico
@Tico - 請問您能解釋這種行爲以及如何使用它嗎? –