views:

335

answers:

2

I have a single RoutedUICommand that can be accessed through various places in the UI. Such as global Keyboardshortcut, Menu, ContextMenu or Button. The code that is to be executed in the RoutedUICommand.CanExecute and RoutedUICommand.Execute methods depends on what UI element was used. How can I achieve this differentiation. I was thinking that I could use the (Can)ExecutedRoutedEventArgs.Source or OrigianlSource but the source is always the same. It is the main Root window. How is this usually achieved? What could I possibly be doing wrong?

A: 

Normally you could have different CommandBinding implementations for different 'Targets' - having different behavior for each 'Source' is unusual.

Could you give an example of what you are trying to do?

Patrick Klug
Exactly to have diffrent source I hat to wire up command bindings for esch source. That way I could differentiate who is the source by examining the sender.
bitbonk
+1  A: 

If you need different code to run depending on the UI that invoked the command you are probably doing something wrong.

If you have something like a just doing something from a keystroke or opening a dialog asking for more information from a menu you should break this apart into two commands (like MS Office "Print" and "Quick Print" commands).

If you truly have to do different things from each UI element you are not getting any advantage from using commands and should think about using old fashioned event handlers, at least then the element specific code is tied to the element and not stored in a central all encompassing "Execute" code .

And if you choose to ignore my advice above, take a look at the CommandParameter property, you can set a different value fro the parameter for each UI element, at least with it you can keep an illusion of the UI/Logic separation commands are designed to provide.

Nir