Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When to use events over commands in WPF?

Hi i have recently looked into WPF and started learning about Events and Commands. I typically use Commands on Button clicks which causes a method to Run in my "view model".

Is it possible to make the Button react to any other events like the MouseOver event through the use of commnds? Or would WPF Events be used in this case?

If WPF Events are to be used, then should the event handler implementation just call a method in the View Model to keep concerns sperate?

like image 461
CAA Avatar asked May 23 '11 14:05

CAA


People also ask

What are events in WPF?

In a WPF application, events are often implemented as a tunneling/bubbling pair. So, you'll have a preview MouseDown and then a MouseDown event. Given below is a simple example of a Routed event in which a button and three text blocks are created with some properties and events.

What is the use of commands in WPF?

Commanding is an input mechanism in Windows Presentation Foundation (WPF) which provides input handling at a more semantic level than device input. Examples of commands are the Copy, Cut, and Paste operations found on many applications.

Why would you want to use routed commands instead of events?

Routed commands give you three main things on top of normal event handling: Routed command source elements (invokers) can be decoupled from command targets (handlers)—they do not need direct references to one another, as they would if they were linked by an event handler.

What is RelayCommand?

The RelayCommand and RelayCommand<T> are ICommand implementations that can expose a method or delegate to the view. These types act as a way to bind commands between the viewmodel and UI elements.


1 Answers

This is a fair question, and one that is a common, yet "solved" (debatably) problem within the MVVM architecture realm. If you are using an MVVM framework, you are likely to find something similar to the EventToCommand Behavior, here is the sample from the MVVM Light Toolkit.

In short, this allows you to map an event to a command binding like so:

<Rectangle Fill="White"        Stroke="Black"        Width="200"        Height="100"> <i:Interaction.Triggers>     <i:EventTrigger EventName="MouseEnter">         <cmd:EventToCommand Command="{Binding TestCommand,                                       Mode=OneWay}"            CommandParameter="{Binding Text,                               ElementName=MyTextBox,                               Mode=OneWay}"            MustToggleIsEnabledValue="True" />     </i:EventTrigger> </i:Interaction.Triggers> </Rectangle> 

Update:

There are two other "reasonable" solutions to this problem:

One uses the now considered legacy "AttachedCommandBehavior" extension found here.

The other is a little bit irritating, but workable.

  1. Capture a command via en event purely in the view.
  2. Query the control's DataSource Step
  3. Grab a string binding target identifier that denotes your command (perhaps using a const string on the view)
  4. Invoke your command on the view model via reflection and pass in the command arguments.

This looks gross but I'm fairly certain is actually a bit faster than just using traditional command bindings. In order to be sure I'd need to see the IL, and I don't think that it matters in this case.

/Update

I want to note however that this is not always an ideal situation. I've discovered that more often than not, I'm using EventToCommand to cover a design issue. Please consider the following:

  • Use events and code behind to handle User-Interface related behaviors.
  • Consider creating custom controls that have command bindings if appropriate, especially if you find yourself using commands to encapsulate event driven bevahior to set bound data that is then reflected in the view. (i.e. setting a transparency value based on proximity to a control or something similar)
  • EventToCommand should most likely be used to handle "Command-like" events only (double clicking etc) not reactive events (mouse-over). However there is nothing preventing this. Implement as you see fit.

Most importantly perhaps is that you remember that you are the developer. Guidelines in themselves do not solve problems, but consideration of guidelines may make the solution to a problem apparent.

like image 165
Firoso Avatar answered Sep 29 '22 13:09

Firoso