I originally created a behavior to add double click support to a silverlight datagrid. Post here http://www.dansoltesz.com/post/2010/02/19/Silverlight-datagrid-double-click-behavior.aspx
I had someone ask me how they could get this to work with MVVM so I want to post the changes to the DataGridDoubleClickBehavior class in the original post to support commanding.
Add a new dependency property
public ICommand DoubleClickCommand
{
get { return (ICommand)GetValue(DoubleClickCommandProperty); }
set { SetValue(DoubleClickCommandProperty, value); }
}
public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(DataGridDoubleClickBehavior), new PropertyMetadata(DoubleClickCommandChanged));
private static void DoubleClickCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Code for dealing with your property changes
}
public object CommandParameter
{
get { return (object)GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(DataGridDoubleClickBehavior), new PropertyMetadata(CommandParameterChanged));
private static void CommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Code for dealing with your property changes
}
Now in the _gridClickManager_DoubleClick event defined in the behavior add this new line
void _gridClickManager_DoubleClick(object sender, MouseButtonEventArgs e)
{
if (DoubleClick != null)
DoubleClick(sender, e);
if(DoubleClickCommand != null) DoubleClickCommand.Execute(CommandParameter); //code added
}
the behavior class now looks like this
public class DataGridDoubleClickBehavior : Behavior<DataGrid>
{
private readonly MouseClickManager _gridClickManager;
public event EventHandler<MouseButtonEventArgs> DoubleClick;
public object CommandParameter
{
get { return (object)GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(DataGridDoubleClickBehavior), new PropertyMetadata(CommandParameterChanged));
private static void CommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Code for dealing with your property changes
}
public ICommand DoubleClickCommand
{
get { return (ICommand)GetValue(DoubleClickCommandProperty); }
set { SetValue(DoubleClickCommandProperty, value); }
}
public static readonly DependencyProperty DoubleClickCommandProperty = DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(DataGridDoubleClickBehavior), new PropertyMetadata(DoubleClickCommandChanged));
private static void DoubleClickCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Code for dealing with your property changes
}
public DataGridDoubleClickBehavior()
{
_gridClickManager = new MouseClickManager(300);
_gridClickManager.DoubleClick += new MouseButtonEventHandler(_gridClickManager_DoubleClick);
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.LoadingRow += OnLoadingRow;
AssociatedObject.UnloadingRow += OnUnloadingRow;
}
void OnUnloadingRow(object sender, DataGridRowEventArgs e)
{
//row is no longer visible so remove double click event otherwise
//row events will miss fire
e.Row.MouseLeftButtonUp -= _gridClickManager.HandleClick;
}
void OnLoadingRow(object sender, DataGridRowEventArgs e)
{
//row is visible in grid, wire up double click event
e.Row.MouseLeftButtonUp += _gridClickManager.HandleClick;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.LoadingRow -= OnLoadingRow;
AssociatedObject.UnloadingRow -= OnUnloadingRow;
}
void _gridClickManager_DoubleClick(object sender, MouseButtonEventArgs e)
{
if (DoubleClick != null)
DoubleClick(sender, e);
if (DoubleClickCommand != null)
DoubleClickCommand.Execute(CommandParameter);
}
}
Now in your datagrid instead of wiring up an event for the double click you bind to the DoubleClickCommand of your viewmodel.
Originally was
<data:DataGrid x:Name="myDataGrid">
<i:Interaction.Behaviors>
<behaviors:DataGridDoubleClickBehavior DoubleClick="myDataGrid_DoubleClick"/>
</i:Interaction.Behaviors>
</data:DataGrid>
Now change to
That its, now when a user double clicks a grid row, the command will be raised in your viewModel.
<data:DataGrid x:Name="myDataGrid">
<i:Interaction.Behaviors>
<behaviors:DataGridDoubleClickBehavior
DoubleClickCommand="{Binding DoubleCommand}"
CommandParameter="{Binding SelectedItem, ElementName=myDataGrid}"/>
</i:Interaction.Behaviors>
</data:DataGrid>