Project Description:
This project extends and improves existing command binder.It has feature of binding multiple events of a single control to multiple commands.
Benefits:
- Ability to bind multiple event to multiple commands.
- In CommandArgs in command handler you can even get original event args this was not possible with existing command binders.
- In CommandArgs in command handler you can even get original source of the event this was not possible with existing command binders.
- In this you can control individual CanExecute methods.
Project Contents:
To use this multi event command feature you should update the files like shown below.
XAML:
<Canvas mecb:CommandBehavior.Event="MouseDown,MouseEnter,MouseMove,MouseUp,MouseLeave" Background="LightBlue" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" mecb:CommandBehavior.Command="{Binding DockPanelCommandCollection}" mecb:CommandBehavior.CommandParameter="{Binding ElementName=txtCommandParameter,Path=Text}" > <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" TextWrapping="Wrap">Test Mouse Event In This Block</TextBlock> </Canvas>
C#
#region Constructor public ClientUserControlViewModel() { DockPanelCommandCollection=new ObservableCollection<RelayCommand> { MouseDownCommand, MouseUpCommand, MouseEnterCommand, MouseMoveCommand, MouseLeaveCommand }; MouseMoveIsChecked = true; } #endregion #region Members private RelayCommand _mouseDownCommand; private RelayCommand _mouseUpCommand; private RelayCommand _mouseMoveCommand; private RelayCommand _mouseEnterCommand; private RelayCommand _mouseLeaveCommand; private string _lastEvent; private string _leftButtonState; private string _rightButtonState; private string _commandParamterValue; #endregion #region Commands public RelayCommand MouseDownCommand { get { return _mouseDownCommand ?? (_mouseDownCommand = new RelayCommand(MouseDownCommandHandler,CanExecuteMouseDown){EventName = "MouseDown"}) ; } } private bool CanExecuteMouseDown(object obj) { return !MouseDownIsChecked; } public RelayCommand MouseUpCommand { get { return _mouseUpCommand ?? (_mouseUpCommand = new RelayCommand(MouseUpCommandHandler, CanExecuteMouseUp) { EventName = "MouseUp" }); } } private bool CanExecuteMouseUp(object obj) { return !MouseUpIsChecked; } public RelayCommand MouseEnterCommand { get { return _mouseEnterCommand ?? (_mouseEnterCommand = new RelayCommand(MouseEnterCommandHandler,CanExecuteMouseEnter) { EventName = "MouseEnter" }); } } private bool CanExecuteMouseEnter(object obj) { return !MouseEnterIsChecked; } public RelayCommand MouseMoveCommand { get { return _mouseMoveCommand ?? (_mouseMoveCommand = new RelayCommand(MouseMoveCommandHandler,CanExecuteMouseMove) {EventName = "MouseMove"}); } } private bool CanExecuteMouseMove(object obj) { return !MouseMoveIsChecked; } public RelayCommand MouseLeaveCommand { get { return _mouseLeaveCommand ?? (_mouseLeaveCommand = new RelayCommand(MouseLeaveCommandHandler,CanExecuteMouseLeave) { EventName = "MouseLeave" }); } } private bool CanExecuteMouseLeave(object obj) { return !MouseLeaveIsChecked; } #endregion #region Handlers private void MouseDownCommandHandler(CommandArgs obj) { LastEvent = "MouseDown"; TryCatch.BeginTryCatch(UpdateResults,obj); } private void MouseUpCommandHandler(CommandArgs obj) { LastEvent = "MouseUp"; TryCatch.BeginTryCatch(UpdateResults, obj); } private void MouseEnterCommandHandler(CommandArgs obj) { LastEvent = "MouseEnter"; TryCatch.BeginTryCatch(UpdateResults, obj); } private void MouseMoveCommandHandler(CommandArgs obj) { LastEvent = "MouseMove"; TryCatch.BeginTryCatch(UpdateResults, obj); } private void MouseLeaveCommandHandler(CommandArgs obj) { LastEvent = "MouseLeave"; TryCatch.BeginTryCatch(UpdateResults, obj); } #endregion #region CommandCollection public ObservableCollection<RelayCommand> DockPanelCommandCollection { get; set; } #endregion #region Methods private void UpdateResults(CommandArgs obj) { var args = obj.OriginalArgs as MouseEventArgs; if(args!=null) { LeftButtonState = args.LeftButton.ToString(); RightButtonState = args.RightButton.ToString(); } if (obj.CommandParameters != null) CommandParameterValue = obj.CommandParameters.ToString(); } #endregion #region Properties private bool _mouseDownIsChecked; public bool MouseDownIsChecked { get { return _mouseDownIsChecked; } set { _mouseDownIsChecked = value; NotifyPropertyChanged(this, o => o.MouseDownIsChecked); } } private bool _mouseUpIsChecked; public bool MouseUpIsChecked { get { return _mouseUpIsChecked; } set { _mouseUpIsChecked = value; NotifyPropertyChanged(this, o => o.MouseUpIsChecked); } } private bool _mouseEnterIsChecked; public bool MouseEnterIsChecked { get { return _mouseEnterIsChecked; } set { _mouseEnterIsChecked = value; NotifyPropertyChanged(this, o => o.MouseEnterIsChecked); } } private bool _mouseLeaveIsChecked; public bool MouseLeaveIsChecked { get { return _mouseLeaveIsChecked; } set { _mouseLeaveIsChecked = value; NotifyPropertyChanged(this, o => o.MouseLeaveIsChecked); } } private bool _mouseMoveIsChecked; public bool MouseMoveIsChecked { get { return _mouseMoveIsChecked; } set { _mouseMoveIsChecked = value; NotifyPropertyChanged(this, o => o.MouseMoveIsChecked); } } public string LastEvent { get { return _lastEvent; } set { _lastEvent = value; NotifyPropertyChanged(this, o => o.LastEvent); } } public string LeftButtonState { get { return _leftButtonState; } set { _leftButtonState = value; NotifyPropertyChanged(this, o => o.LeftButtonState); } } public string RightButtonState { get { return _rightButtonState; } set { _rightButtonState = value; NotifyPropertyChanged(this, o => o.RightButtonState); } } public string CommandParameterValue { get { return _commandParamterValue; } set { _commandParamterValue = value; NotifyPropertyChanged(this, o => o.CommandParameterValue); } } #endregion