Как просто отправить текущий выбранный элемент DataGridRow в ICommand во ViewModel по двойному щелчку - PullRequest
0 голосов
/ 20 ноября 2018

Можно ли отправить текущий выбранный DataGridRow двойным щелчком InputBinding?

У меня есть это в моем представлении

<DataGrid ItemsSource="{Binding Consignments}" 
            x:Name="dataGridConsignments" 
            Margin="10,47,10,9.6"
            IsReadOnly="True" ColumnWidth="*" AutoGenerateColumns="False"
            xmlns:DataGridDoubleClickCommand="{Binding DataGridDoubleClick}">
    <DataGrid.InputBindings>
        <MouseBinding Gesture="LeftDoubleClick"  Command="{Binding RowDoubleClick}"/>
    </DataGrid.InputBindings>

...

И модель представления содержит

private ICommand rowDoubleClick;
public ICommand RowDoubleClick
{
    get
    {
        return rowDoubleClick
            ?? (rowDoubleClick= new ActionCommand(() =>
            {
                // I need the selected row here
                MessageBox.Show("asd");
            }));
    }
}

С помощью этой реализации ActionCommand:

public class ActionCommand : ICommand
{
    private readonly Action _action;

    public ActionCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете просто использовать CommandParameter.

<MouseBinding Gesture="LeftDoubleClick" Command="{Binding RowDoubleClick}"
   CommandParameter="{Binding ElementName=dataGridConsignments, Path=SelectedItem}"/>

. Для этого вам потребуется реализовать интерфейс ICommand таким образом, чтобы ваш Action принял параметр.Вы можете увидеть стандартную реализацию и использование RelayCommand здесь .Это очень похоже на то, что вы сделали для ActionCommand, но позволяет использовать параметр, который вы можете использовать в своем коде.

В качестве альтернативы, вы можете просто связать SelectedItem вашего DataGrid ссвойство в вашей модели представления, и используйте его при запуске команды.

<DataGrid ItemsSource="{Binding Consignments}" SelectedItem="{Binding VMSelectedItem}" ../>

Для любого из подходов имейте в виду, что, если в DataGrid нет выбранных элементов, выбранный элемент будет null, поэтому перед выполнением проверки на нуль необходимооперируя свойством / параметром.

0 голосов
/ 20 ноября 2018

Вы можете попробовать добавить эту строку в DataGrid

ItemsSource="{Binding Consignments}" SelectedItem="{Binding SelectedConsignment}"

Имейте в виду, чтобы уведомить "OnPropertyChanged".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...