Click here to Skip to main content
15,884,237 members
Articles / Desktop Programming / WPF
Tip/Trick

Mouse Event Commands for MVVM

Rate me:
Please Sign up or sign in to vote.
4.95/5 (19 votes)
22 Jan 2013CPOL 110.1K   3.2K   22   28
Use an Attached Property to execute an ICommand.

Introduction

If you ever want to pass MouseEventArgs to a ViewModel, here's a neat way to do it Smile | <img src=

The Attached Property 

C#
public class MouseBehaviour
{
    public static readonly DependencyProperty MouseUpCommandProperty =
        DependencyProperty.RegisterAttached("MouseUpCommand", typeof(ICommand), 
        typeof(MouseBehaviour), new FrameworkPropertyMetadata(
        new PropertyChangedCallback(MouseUpCommandChanged)));

    private static void MouseUpCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)d;

        element.MouseUp += new MouseButtonEventHandler(element_MouseUp);
    }

    static void element_MouseUp(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)sender;

        ICommand command = GetMouseUpCommand(element);

        command.Execute(e);
    }

    public static void SetMouseUpCommand(UIElement element, ICommand value)
    {
        element.SetValue(MouseUpCommandProperty, value);
    }

    public static ICommand GetMouseUpCommand(UIElement element)
    {
        return (ICommand) element.GetValue(MouseUpCommandProperty);
    }
}

We simply register the attached property, hook the MouseUp event for the FrameworkElement, and invoke the Command in the handler. Simple enough, right? 

Usage 

XML
<Image Source="c:/temp.png" [Your xmlns]:MouseBehaviour.MouseUpCommand="{Binding MouseUpCommand}"></Image>

You do not, of course, have to use an <Image>, any framework element will work just fine. That's the beauty of Attached Properties! 

Having trouble attaching source, which contains Attached Properties for handling any mouse event MVVM style. But when it's up, includes 

  • MouseUp
  • MouseDown
  • MouseEnter
  • MouseLeave
  • MouseLeftButtonDown
  • MouseLeftButtonUp
  • MouseMove
  • MouseRightButtonDown
  • MouseRightButtonUp
  • MouseWheel

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Lovatts Publications
Australia Australia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionDoesn't work for me Pin
Touki Liu27-Mar-23 16:02
Touki Liu27-Mar-23 16:02 
GeneralMy vote of 5 Pin
sbarnes26-Jan-20 1:29
sbarnes26-Jan-20 1:29 
QuestionMy vote of 5 Pin
Member 35098766-Jun-17 5:02
Member 35098766-Jun-17 5:02 
QuestionYou forgot about MouseEnter in code Pin
Member 121224679-Jan-17 23:02
Member 121224679-Jan-17 23:02 
QuestionHow can i know the Rotation direction MouseWheel? Pin
Grigor Yeghiazaryan22-Jan-16 8:57
Grigor Yeghiazaryan22-Jan-16 8:57 
GeneralMy vote of 5 Pin
DongJin Kim10-Sep-15 13:44
DongJin Kim10-Sep-15 13:44 
Generalvery usefull Pin
Seifeddine198619-Dec-14 12:40
Seifeddine198619-Dec-14 12:40 
QuestionDoes not work with Button (instead of Rectangle) Pin
Member 105378903-Oct-14 1:58
Member 105378903-Oct-14 1:58 
AnswerRe: Does not work with Button (instead of Rectangle) Pin
Matt Searles19-Mar-15 16:18
Matt Searles19-Mar-15 16:18 
GeneralMy vote of 3 Pin
Member 1054639429-Jul-14 1:00
Member 1054639429-Jul-14 1:00 
GeneralRe: My vote of 3 Pin
Matthew Searles19-Aug-14 14:20
Matthew Searles19-Aug-14 14:20 
QuestionAmazing Pin
Srikanth Pagadala27-Jul-14 23:22
Srikanth Pagadala27-Jul-14 23:22 
AnswerRe: Amazing Pin
Matthew Searles19-Aug-14 14:21
Matthew Searles19-Aug-14 14:21 
Questionmissing png images? Pin
sbarnes2-Apr-14 23:01
sbarnes2-Apr-14 23:01 
AnswerRe: missing png images? Pin
sbarnes2-Apr-14 23:07
sbarnes2-Apr-14 23:07 
AnswerRe: missing png images? Pin
Matt Searles3-May-14 23:32
Matt Searles3-May-14 23:32 
Questionproject is not compiled Pin
Member 1019491420-Mar-14 20:02
Member 1019491420-Mar-14 20:02 
AnswerRe: project is not compiled Pin
MarkWardell19-Mar-15 3:11
MarkWardell19-Mar-15 3:11 
GeneralMy vote of 5 Pin
Wolfgang Polzleitner11-Mar-14 8:50
Wolfgang Polzleitner11-Mar-14 8:50 
GeneralRe: My vote of 5 Pin
Matt Searles11-Mar-14 15:00
Matt Searles11-Mar-14 15:00 
Thanks Wolfgang, happy coding!
QuestionBubbled events prevent this from working Pin
RickB_AZ1-Jan-14 5:32
RickB_AZ1-Jan-14 5:32 
AnswerRe: Bubbled events prevent this from working Pin
selfwalker27-Mar-14 16:39
selfwalker27-Mar-14 16:39 
SuggestionGarbage Collection? Pin
haindl17-Oct-12 21:39
haindl17-Oct-12 21:39 
GeneralRe: Garbage Collection? Pin
Dakko18-Oct-12 0:49
Dakko18-Oct-12 0:49 
GeneralRe: Garbage Collection? Pin
haindl18-Oct-12 1:50
haindl18-Oct-12 1:50 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.