Подтвердить что ты не робот

WPF DataGrid: CommandBinding для двойного клика вместо использования событий

Я знаю, как использовать событие 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 и заменить его соответствующим образом.

4b9b3361

Ответ 1

Вы проверили это сообщение , предоставляете полное решение...

Ответ 2

Нет необходимости в прикрепленном поведении или пользовательских подклассах 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; }
}

Ответ 3

Другим решением является добавление привязок ввода и привязка выбранного элемента к свойству, чтобы вы знали, какой из них был выбран:

<DataGrid SelectedItem="{Binding SelectedItem}">
      <DataGrid.InputBindings>
          <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
     </DataGrid.InputBindings>
</DataGrid>

Ответ 4

Используйте эту библиотеку

Пример привязки к событию 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>

Ответ 5

Или вы можете создать производный класс

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}">

Ответ 6

Добавление IsReadOnly="True" сделало эту работу за меня, но у вас уже есть это в вашем коде