35

我知道如何将 MouseDoubleClick 事件与我的 DataGrid 一起使用来获取选定的值,但是如何改用命令绑定呢?这样我的 ViewModel 可以处理逻辑。

到目前为止,我有以下内容:

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" MouseDoubleClick="TestGrid_MouseDoubleClick"
          ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" AlternationCount="2" GridLinesVisibility="None">

我想摆脱 MouseDoubleClick 并适当地替换它。

4

4 回答 4

85

这里不需要附加行为或自定义 DataGrid 子类。

在你的DataGrid,绑定ItemsSource到一个ICollectionView. 这里的技巧是设置IsSynchronizedWithCurrentItem="True"这意味着选定的行将是当前项目。

技巧的第二部分是CommandParameter使用正斜杠语法绑定到当前项目。

当双击一行时,该命令将以单击的行作为参数执行。

<DataGrid
    ItemsSource="{Binding CollectionView}"
    IsSynchronizedWithCurrentItem="True">
    <DataGrid.InputBindings>
        <MouseBinding
            MouseAction="LeftDoubleClick"
            Command="{Binding DoubleClickCommand}"
            CommandParameter="{Binding CollectionView/}"/>
    </DataGrid.InputBindings>
</DataGrid>

这是视图模型的(简化)版本的外观:

class MyViewModel
{
    public ICollectionView CollectionView { get; set; }

    public ICommand DoubleClickCommand { get; set; }
}
于 2013-11-06T09:32:15.330 回答
31

另一种解决方案是添加输入绑定,并将 selectedItem 绑定到一个属性,以便您知道选择了哪个:

<DataGrid SelectedItem="{Binding SelectedItem}">
      <DataGrid.InputBindings>
          <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
     </DataGrid.InputBindings>
</DataGrid>
于 2013-07-01T12:35:14.980 回答
3

使用这个库

绑定到 datagrid 事件的示例:

<DataGrid xmlns:command="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior"
    command:CommandBehavior.Event="MouseDoubleClick"
    command:CommandBehavior.Command="{Binding TestCommand}" />

但是这段代码更好,因为只在行点击时引发:

<DataGrid>
    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Setter Property="command:CommandBehavior.Event" Value="MouseDoubleClick"/>
            <Setter Property="command:CommandBehavior.Command" Value="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
        </Style>
    </DataGrid.Resources>
</DataGrid>
于 2010-10-06T21:29:13.047 回答
1

或者,您可以创建一个派生类

public class CustomDataGrid : DataGrid
{
    public ICommand DoubleClickCommand
    {
        get { return (ICommand)GetValue(DoubleClickCommandProperty); }
        set { SetValue(DoubleClickCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DoubleClickCommand.  This    enables animation, styling, binding, etc...
    public static readonly DependencyProperty DoubleClickCommandProperty =
        DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(CustomDataGrid), new UIPropertyMetadata());

    public CustomDataGrid()
        : base()
    {            
        this.PreviewMouseDoubleClick += new MouseButtonEventHandler(CustomDataGrid_PreviewMouseDoubleClick);
    }


    void CustomDataGrid_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (DoubleClickCommand != null)
        {
            DoubleClickCommand.Execute(null);
        }
    }


}

并在 XAML 中简单地绑定到新创建的命令

<CustomDataGrid DoubleClickCommand="{Binding DoubleClickCommand}">
于 2012-04-18T07:56:42.173 回答