Как передать информацию о ячейке из DataGrid в WPF KeyBinding?

У меня есть DataGrid для перечисления коллекции MobileInfo. DataGrid настроен с SelectionUnit="FullRow", Если я щелкну любую строку, то выберет всю строку, дополнительно указав ячейку с границей, где была нажата мышь. Выбор границ перемещается при навигации по клавиатуре. Например: Left, Right, Up а также Down, На основании выбора ячейки я хочу передать информацию о ячейке.

Обратитесь к изображению у него есть экран вывода

Ячейка, выбранная в колонке ОС

На приведенном выше снимке экрана выбран Android, на основе навигации по клавиатуре выбор ячейки изменяется.

Мой исходный код XAML:

<DataGrid  AutoGenerateColumns="False" ItemsSource="{Binding MobileList, UpdateSourceTrigger=PropertyChanged}" SelectionUnit="FullRow" IsReadOnly="True">
    <DataGrid.InputBindings>
        <KeyBinding Key="C" Modifiers="Ctrl" Command="{Binding Path=DataContext.CopyToClipBoardCommand}" CommandParameter="{Binding }" />
    </DataGrid.InputBindings>
    <DataGrid.Columns>
        <!--Column 1-->
        <DataGridTextColumn Binding="{Binding MobileName}" Header="Name" />
        <!--Column 2-->
        <DataGridTextColumn Binding="{Binding MobileOS}" Header="OS" />
    </DataGrid.Columns>
</DataGrid>

Примечание: не меняйте SelectionUnit в DataGrid

Пожалуйста, предоставьте свое решение, как передать информацию о ячейке на основе клавиатуры.

Исходный код C#, связанный с сеткой данных XAML

public class GridViewModel
{
    public ObservableCollection<MobileInfo> MobileList { get; set; }

    public GridViewModel()
    {
        MobileList = new ObservableCollection<MobileInfo>();
        MobileList.Add(new MobileInfo  { MobileName = "iPhone", MobileOS = "iOS" });
        MobileList.Add(new MobileInfo { MobileName = "Xperia", MobileOS = "Android" });
        MobileList.Add(new MobileInfo { MobileName = "Lumina", MobileOS = "Windows" });
    }

}

public class MobileInfo
{
    public string MobileName { get; set; }
    public string MobileOS { get; set; }
}

3 ответа

Решение

Вы можете привязать параметр команды к DataGrid.CurrentCell имущество. Есть несколько способов сделать это, один из которых - указать относительный источник привязки:

<KeyBinding Key="C"
            Modifiers="Control"
            Command="{Binding CopyToClipBoardCommand}"
            CommandParameter="{Binding CurrentCell, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />

Обратите внимание, что я удалил DataContext. часть из пути привязки команды (DataContext является источником по умолчанию для привязки, если источник не указан явно).

Параметр команды теперь будет объектом типа DataGridCellInfo, которая является структурой, а не классом.

Вы можете изменить путь привязки параметра команды, чтобы извлечь более конкретную информацию.

Этот код может помочь вам в том, чего вы хотите достичь с помощью MVVM:

<i:Interaction.Triggers>
    <i:EventTrigger  EventName="KeyUp">
        <i:InvokeCommandAction Command="{Binding Path=DataContext.CurrentCellChangeCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"
                                    CommandParameter="{Binding CurrentCell, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"
                                    ></i:InvokeCommandAction>
    </i:EventTrigger>
</i:Interaction.Triggers>

Код ViewModel,

public ICommand CurrentCellChangeCommand
{
    get { return new RelayCommand(CurrentCellChangeExecute); }
}

private void CurrentCellChangeExecute(object obj)
{
    var dataGridCellInfo = (System.Windows.Controls.DataGridCellInfo)obj;

    var mobileInfo = dataGridCellInfo.Item as MobileInfo;

    if (mobileInfo != null)
    {
        if (dataGridCellInfo.Column.Header.ToString() == "Name")
        {
            SelectedCellValue = mobileInfo.MobileName;
            //mobileInfo.MobileName 
        }
        else if (dataGridCellInfo.Column.Header.ToString() == "OS")
        {
            SelectedCellValue = mobileInfo.MobileOS;
            //mobileInfo.MobileOS 
        }
    }
}

Вы можете просто использовать CurrentCellChanged Event в DataGrid xaml.

 CurrentCellChanged="DataGrid_CurrentCellChanged"

код...

private void DataGrid_CurrentCellChanged(object sender, EventArgs e)
        {
            var grid = sender as DataGrid;
            var cell = grid.CurrentCell.Item;
        }
Другие вопросы по тегам