2017-03-03 3 views
0

Ich arbeite an Anwendung, wo Benutzer Produkte zu einem Datagrid hinzufügen kann, mit einfachen Informationen wie Produktname und Preis, und danach Ich möchte zum Beispiel Taste F4 drücken auf meiner Tastatur und ich möchte auf das letzte Element in Datagrid konzentrieren, das bedeutet, wählen Sie es und markieren Sie dieses Element!C# WPF KeyDown Highlight + ausgewählte letzte Zeile in Datagrid

Also Jungs, wie ich das erreichen konnte, habe ich einige Lösungen versucht, wie Index auf meine DataGrid- und smth wie die ausgewählte Einstellung, aber es funktioniert nicht

Danke Jungs, Beifall

+0

Haben Sie Beispielcode haben? Mit welchem ​​Code haben Sie den ausgewählten Index festgelegt? Welcher Teil deines Versuchs hat nicht funktioniert? Bitte schreibe ein Beispiel für [Minimal, vollständig und verifizierbar] (http://stackoverflow.com/help/mcve), das zu deiner Frage passt. –

Antwort

1

Programmatically eine Zeile oder Zelle in einem DataGrid hervorzuheben ist etwas komplizierter als nur die SelectedIndex oder SelectedItem Eigenschaft festlegen.

Es ist jedoch möglich, eine Zeile im Code zu wählen und konzentrieren und das gleiche Verhalten wie zu erhalten, wenn durch den Zugriff auf die visuellen Elementen der Benutzeroberfläche der DataGrid Steuerung und den Aufruf die UIElement.Focus() Methode auf einem bestimmten DataGridCell Objekt mit der Maus, wie in der folgende Blogpost.

Wie programmatisch auszuwählen und eine Zeile oder Zelle in einem Datagrid in WPF konzentrieren:https://blog.magnusmontin.net/2013/11/08/how-to-programmatically-select-and-focus-a-row-or-cell-in-a-datagrid-in-wpf/

Hier ist ein Beispiel:

public partial class MainWindow : Window 
{ 
    public MainWindow 
    { 
     InitializeComponent(); 
     this.PreviewKeyDown += (s, e) => 
     { 
      if(e.Key == Key.F4) 
       SelectRowByIndex(dataGridProducts, dataGridProducts.Items.Count - 1); 
     }; 

     //populate DataGrid etc... 
    } 

    private static void SelectRowByIndex(DataGrid dataGrid, int rowIndex) 
    { 
     if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow)) 
      throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow."); 

     if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1)) 
      throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex)); 

     dataGrid.SelectedItems.Clear(); 
     object item = dataGrid.Items[rowIndex]; 
     dataGrid.SelectedItem = item; 

     DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow; 
     if (row == null) 
     { 
      /* bring the data item (Product object) into view 
      * in case it has been virtualized away */ 
      dataGrid.ScrollIntoView(item); 
      row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow; 
     } 
     if (row != null) 
     { 
      DataGridCell cell = GetCell(dataGrid, row, 0); 
      if (cell != null) 
       cell.Focus(); 
     } 
    } 

    private static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column) 
    { 
     if (rowContainer != null) 
     { 
      System.Windows.Controls.Primitives.DataGridCellsPresenter presenter 
       = FindVisualChild<System.Windows.Controls.Primitives.DataGridCellsPresenter>(rowContainer); 
      if (presenter == null) 
      { 
       /* if the row has been virtualized away, call its ApplyTemplate() method 
       * to build its visual tree in order for the DataGridCellsPresenter 
       * and the DataGridCells to be created */ 
       rowContainer.ApplyTemplate(); 
       presenter = FindVisualChild<System.Windows.Controls.Primitives.DataGridCellsPresenter>(rowContainer); 
      } 
      if (presenter != null) 
      { 
       DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell; 
       if (cell == null) 
       { 
        /* bring the column into view 
        * in case it has been virtualized away */ 
        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]); 
        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell; 
       } 
       return cell; 
      } 
     } 
     return null; 
    } 

    private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is T) 
       return (T)child; 
      else 
      { 
       T childOfChild = FindVisualChild<T>(child); 
       if (childOfChild != null) 
        return childOfChild; 
      } 
     } 
     return null; 
    } 
} 
+0

bist du Gott dieses Spiels? Du bist ein toller Mann! Danke vielmals! Woher kennst du all diese Sachen? –

+0

Erfahrung ist König :) – mm8

+0

Ich werde abstimmen, was auch immer Sie wollen, Mann! Könntest du manchmal Kommentare in deinen Code schreiben (selbst wenn du es vor dem Posten eines Codes schreibst) zum Beispiel könntest du Kommentare über die Codezeile schreiben, d. H. Warum du das getan hast und warum du das getan hast, ist dein Code viel leichter zu verstehen als! Und noch einmal DANKE VIEL! :) –

0

können Sie Verwenden Sie eine InputBinding, um die gedrückte F4-Taste zu erkennen.

<Window.InputBindings> 
    <KeyBinding Key="F4" 
       Command="{Binding SelectLastItemCommand}" /> 
</Window.InputBindings> 

Sie einen Blick hier haben können, wie Sie den Eintrag auszuwählen: WPF Binding SelectedItem in DataGrid