Как передать информацию о ячейке из 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;
}