c# - ¿Cómo pasar la información de la celda de DataGrid en WPF KeyBinding?
xaml key-bindings (3)
Tengo un DataGrid para listar la Colección de MobileInfo. El DataGrid se configura con SelectionUnit="FullRow"
. Si hago clic en cualquier fila, selecciona toda la fila y, además, señala la celda con el borde donde golpeó el mouse. La selección del borde se mueve mientras navega por el teclado. Por ejemplo: Left
, Right
, Up
y Down
. Basado en la selección de células, deseo pasar la información sobre la célula.
Referir la imagen que tiene la pantalla de salida
En la captura de pantalla anterior se selecciona Android, en función de la navegación por el teclado, la selección de celda se cambia.
Mi código fuente 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>
Nota: No cambie la SelectionUnit en el DataGrid
Proporcione su solución, cómo pasar la información de la celda basada en la navegación del teclado
El código fuente de C # asociado con XAML DataGrid
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; }
}
Este código puede ayudarte en lo que quieres lograr con 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>
Código de 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
}
}
}
Puede vincular el parámetro de comando a la propiedad DataGrid.CurrentCell
. Hay varias formas de lograr eso, una de las cuales es especificar la fuente relativa para el enlace:
<KeyBinding Key="C"
Modifiers="Control"
Command="{Binding CopyToClipBoardCommand}"
CommandParameter="{Binding CurrentCell, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />
Tenga en cuenta que DataContext.
el DataContext.
parte de la ruta de enlace del comando ( DataContext
es la fuente predeterminada para el enlace si el origen no está explícitamente especificado).
El parámetro de comando ahora será un objeto de tipo DataGridCellInfo
, que es una estructura , y no una clase.
Puede modificar la ruta de enlace del parámetro de comando para extraer información más específica.
simplemente puede usar el evento CurrentCellChanged en DataGrid xaml.
CurrentCellChanged="DataGrid_CurrentCellChanged"
código...
private void DataGrid_CurrentCellChanged(object sender, EventArgs e)
{
var grid = sender as DataGrid;
var cell = grid.CurrentCell.Item;
}