2010-05-13 44 views
1

如何將DataGrid的MouseDoubleClick事件綁定到委託命令並獲取該網格的選定項目。我想在XAML文件中執行此操作,因爲我使用的是Prism 2.0和MVVM模式。如何綁定MouseDoubleClick事件

回答

2

請看附加的屬性,這將有所幫助。 下面是有助於我的代碼,我曾經在某處看過這個代碼,但是不管怎樣,他都不記得這個網站或作者的名字。

/// <summary> 
/// The static class the defines the attached command DP for exposing MouseDoubleClick 
/// event as a command 
/// </summary> 
public static class CommandMouseDoubleClick 
{ 
    #region TheCommandToRun 

    /// <summary> 
    /// TheCommandToRun : The actual ICommand to run 
    /// </summary> 
    public static readonly DependencyProperty TheCommandToRunProperty = 
     DependencyProperty.RegisterAttached("TheCommandToRun", typeof(ICommand), 
     typeof(CommandMouseDoubleClick), 
     new FrameworkPropertyMetadata((ICommand)null)); 

    /// <summary> 
    /// Gets the TheCommandToRun property.  
    /// </summary> 
    public static ICommand GetTheCommandToRun(DependencyObject d) 
    { 
     return (ICommand)d.GetValue(TheCommandToRunProperty); 
    } 

    /// <summary> 
    /// Sets the TheCommandToRun property. 
    /// </summary> 
    public static void SetTheCommandToRun(DependencyObject d, ICommand value) 
    { 
     d.SetValue(TheCommandToRunProperty, value); 
    } 

    #endregion 

    #region RoutedEventName 

    /// <summary> 
    /// RoutedEventName : The event that should actually execute the 
    /// ICommand 
    /// </summary> 
    public static readonly DependencyProperty RoutedEventNameProperty = 
     DependencyProperty.RegisterAttached("RoutedEventName", typeof(String), 
     typeof(CommandMouseDoubleClick), 
     new FrameworkPropertyMetadata((String)String.Empty, 
      new PropertyChangedCallback(OnRoutedEventNameChanged))); 

    /// <summary> 
    /// Gets the RoutedEventName property. 
    /// </summary> 
    public static String GetRoutedEventName(DependencyObject d) 
    { 
     return (String)d.GetValue(RoutedEventNameProperty); 
    } 

    /// <summary> 
    /// Sets the RoutedEventName property. 
    /// </summary> 
    public static void SetRoutedEventName(DependencyObject d, String value) 
    { 
     d.SetValue(RoutedEventNameProperty, value); 
    } 

    /// <summary> 
    /// Hooks up a Dynamically created EventHandler (by using the 
    /// <see cref="MouseDoubleClickEventHooker">MouseDoubleClickEventHooker</see> class) that when 
    /// run will run the associated ICommand 
    /// </summary> 
    private static void OnRoutedEventNameChanged(DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     String routedEvent = (String)e.NewValue; 
     //If the RoutedEvent string is not null, create a new 
     //dynamically created EventHandler that when run will execute 
     //the actual bound ICommand instance (usually in the ViewModel) 
     if (!String.IsNullOrEmpty(routedEvent)) 
     { 
      MouseDoubleClickEventHooker eventHooker = new MouseDoubleClickEventHooker(); 
      eventHooker.ObjectWithAttachedCommand = d; 
      EventInfo eventInfo = d.GetType().GetEvent(routedEvent, 
       BindingFlags.Public | BindingFlags.Instance); 
      //Hook up Dynamically created event handler 
      if (eventInfo != null) 
      { 
       eventInfo.AddEventHandler(d, 
       eventHooker.GetNewEventHandlerToRunCommand(eventInfo)); 
      } 
     } 
    } 

    #endregion 
} 

/// <summary> 
/// Contains the event that is hooked into the source RoutedEvent 
/// that was specified to run the ICommand 
/// </summary> 
sealed class MouseDoubleClickEventHooker 
{ 
    #region Properties 

    /// <summary> 
    /// The DependencyObject, that holds a binding to the actual 
    /// ICommand to execute 
    /// </summary> 
    public DependencyObject ObjectWithAttachedCommand { get; set; } 

    #endregion 

    #region Public Methods 

    /// <summary> 
    /// Creates a Dynamic EventHandler that will be run the ICommand 
    /// when the user specified RoutedEvent fires 
    /// </summary> 
    /// <param name="eventInfo">The specified RoutedEvent EventInfo</param> 
    ///<returns>An Delegate that points to a new EventHandler 
    /// that will be run the ICommand</returns> 
    public Delegate GetNewEventHandlerToRunCommand(EventInfo eventInfo) 
    { 
     Delegate del = null; 
     if (eventInfo == null) 
      throw new ArgumentNullException("eventInfo"); 
     if (eventInfo.EventHandlerType == null) 
      throw new ArgumentException("EventHandlerType is null"); 
     if (del == null) 
      del = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, 
       GetType().GetMethod("OnEventRaised", 
       BindingFlags.NonPublic | 
       BindingFlags.Instance)); 
     return del; 
    } 

    #endregion 

    #region Private Methods 
    /// <summary> 
    /// Runs the ICommand when the requested RoutedEvent fires 
    /// </summary> 
    private void OnEventRaised(object sender, EventArgs e) 
    { 
     ICommand command = (ICommand)(sender as DependencyObject). 
      GetValue(CommandMouseDoubleClick.TheCommandToRunProperty); 
     if (command != null) 
     { 
      command.Execute(null); 
     } 
    } 
    #endregion 
} 

的XAML可能看起來象下面這樣:

<Label local:CommandMouseLeftButtonDown.RoutedEventName="MouseLeftButtonDown" 
     local:CommandMouseLeftButtonDown.TheCommandToRun="{Binding Path=MouseDownCommand, RelativeSource={RelativeSource TemplatedParent}}" 
     local:CommandMouseDoubleClick.RoutedEventName="MouseDoubleClick" 
     local:CommandMouseDoubleClick.TheCommandToRun="{Binding Path=MouseDoubleClickCommand, RelativeSource={RelativeSource TemplatedParent}}"/> 
+0

感謝您的代碼.. – Johnny 2010-05-19 05:58:29