2016-06-30 19 views
0

Ich versuche, den Fokus einer Zelle in einem Datagrid basierend auf einer eingegebenen Teilenummer festzulegen, so dass der Benutzer das Teil scannen und dann den Wert sehr schnell bearbeiten kann. Jetzt kann ich den Index der Teilenummer in der ObservableCollection von Elementen finden, die ich habe, aber ich habe Probleme, ihn auf diese Rasterzelle zu setzen. grTimeEntries ist der Name des Datengitters. Der aktuelle Code unten ist mir ein Fehler beim Versuch, den neuen DataGridCellInfoSetzen Sie den Fokus auf eine bestimmte DataGrid-Zelle

Error 1 Cannot initialize type 'System.Windows.Controls.DataGridCellInfo' with a collection initializer because it does not implement 'System.Collections.IEnumerable' 

Der Code zu erstellen:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     string ToFind = tbIPN.Text; 
     for (int i = 0; i < (grMain.DataContext as DatabaseViewmodel).items.Count; i++) 
     { 
      if ((grMain.DataContext as DatabaseViewmodel).items[i].IPN == ToFind) 
      { 
       grTimeEntries.CurrentCell = new DataGridCellInfo { grTimeEntries.Items[i], grTimeEntries.Columns[1] }; 
       //grTimeEntries.SelectedIndex = i;   Focussed entire row. Wont work if i have selectionunit = "Cell". 
       grTimeEntries.Focus(); 

      } 
     } 
    } 

Antwort

0

Erstellen einer Abhängigkeitseigenschaft, die Zelle zu konzentrieren wird für Sie arbeiten.

public class EDataGridCellFocus 
{ 
    public static object GetFocusedCell(DependencyObject obj) 
    { 
     return obj.GetValue(IsFocusedProperty); 
    } 

    public static void SetFocusedCell(DependencyObject obj, object value) 
    { 
     obj.SetValue(IsFocusedProperty, value); 
    } 

    public static readonly DependencyProperty IsFocusedProperty = 
     DependencyProperty.RegisterAttached(
     "FocusedCell", typeof(object), typeof(EDataGridCellFocus), 
     new UIPropertyMetadata(false, null, OnCoerceValue)); 

    private static object OnCoerceValue(DependencyObject d, object baseValue) 
    { 
     if (((DataGrid)d).Items.Count > 0 || ((DataGrid)d).HasItems) 
     { 
      var row = ((DataGrid)d).ItemContainerGenerator.ContainerFromIndex(baseValue[0]) as DataGridRow; 
      if (row != null) 
      { 
       var cell = ((DataGrid)d).GetCell(row, baseValue[1]); 

        Keyboard.ClearFocus(); 
        FocusManager.SetIsFocusScope(d, true); 
        FocusManager.SetFocusedElement(cell, cell); 
        Keyboard.Focus(cell);      
      } 
     } 
     return baseValue; 
    } 
} 

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int columnIndex = 0) 
    { 
     if (row == null) return null; 

     var presenter = row.FindVisualChild<DataGridCellsPresenter>(); 
     if (presenter == null) return null; 

     var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 
     if (cell != null) return cell; 

     // now try to bring into view and retreive the cell 
     grid.ScrollIntoView(row, grid.Columns[columnIndex]); 
     cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex); 

     return cell; 
    } 
    public static IEnumerable<T> FindVisualChildren<T>(this DependencyObject depObj) 
    where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

    public static childItem FindVisualChild<childItem>(this DependencyObject obj) 
     where childItem : DependencyObject 
    { 
     foreach (childItem child in FindVisualChildren<childItem>(obj)) 
     { 
      return child; 
     } 
     return null; 
    } 

stellen Sie Ihre XAML wie unten,

<DataGrid EDataGridCellFocus.FocusedCell="{Binding Cell}"/> 

Property Bindung

public Object[] Cell 
{ 
    get; 
    set; 
}