Ответ 1
Вы проверили это сообщение , предоставляете полное решение...
Я знаю, как использовать событие 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 и заменить его соответствующим образом.
Вы проверили это сообщение , предоставляете полное решение...
Нет необходимости в прикрепленном поведении или пользовательских подклассах 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; }
}
Другим решением является добавление привязок ввода и привязка выбранного элемента к свойству, чтобы вы знали, какой из них был выбран:
<DataGrid SelectedItem="{Binding SelectedItem}">
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
</DataGrid.InputBindings>
</DataGrid>
Используйте эту библиотеку
Пример привязки к событию 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>
Или вы можете создать производный класс
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}">
Добавление IsReadOnly="True"
сделало эту работу за меня, но у вас уже есть это в вашем коде