This project is read-only.

Double Click Behavior

I implemented the double click behavior by using attach property. When user double clicks on Music List I needed to execute a command and create the default Now Playing playlist. Here is the implementation
public class DoubleClickBehavior 
        private const string CommandName = "Command";
        private const string CommandParameterName = "CommandParameter";

        public static DependencyProperty CommandProperty =
            DependencyProperty.RegisterAttached(CommandName, typeof (ICommand), typeof (DoubleClickBehavior), new UIPropertyMetadata(OnPropertyChanged));

        public static void SetCommand(DependencyObject target, ICommand value)
            target.SetValue(CommandProperty, value);

        public static DependencyProperty CommandParameterProperty =
            DependencyProperty.RegisterAttached(CommandParameterName, typeof(object), typeof(DoubleClickBehavior), new UIPropertyMetadata(OnPropertyChanged));

        public static void SetCommandParameter(DependencyObject target, object value)
            target.SetValue(CommandParameterProperty, value);

        /// <exception cref="InvalidOperationException">This behavior can be attached to Control item only.</exception>
        private static void OnPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
            var element = target as Control;
            if (element == null)
                throw new InvalidOperationException("This behavior can be attached to Control item only.");
            switch (e.Property.Name)
                case CommandName:
                    SubscribeOrUnsubscribeEvent(element, e);

        private static void SubscribeOrUnsubscribeEvent(Control element, DependencyPropertyChangedEventArgs e)
            if ((e.NewValue != null) && (e.OldValue == null))
                element.MouseDoubleClick += HandleEvent;
            else if ((e.NewValue == null) && (e.OldValue != null))
                element.MouseDoubleClick -= HandleEvent;

        private static void HandleEvent(object sender, MouseButtonEventArgs mouseButtonEventArgs)
            var element = (Control) sender;
            var command = (ICommand) element.GetValue(CommandProperty);
            var commandParameter = element.GetValue(CommandParameterProperty);

In XAML I used it as follows...
<DataGrid Name="Grid" HorizontalAlignment="Stretch" IsReadOnly="True"
           Behavior:DoubleClickBehavior.Command="{Binding PlayCommand}"
           Behavior:DoubleClickBehavior.CommandParameter="{Binding DataSource.SelectedMusic}"

See Also Selection Behavior

Last edited May 21, 2011 at 4:59 AM by hsmasud, version 2


No comments yet.