2016-06-30 14 views
0

入力したパーツ番号に基づいてデータグリッド内のセルのフォーカスを設定しようとしているため、ユーザーはバーコードスキャンを実行して値をすばやく編集できます。今では、私が持っている品目のObservableCollectionで部品番号のインデックスを見つけることができますが、そのグリッドセルに設定しようとして問題があります。 grTimeEntriesはデータグリッドの名前です。あなたのために働くだろうセルを集中する依存関係プロパティを作成特定のデータグリッドセルにフォーカスを設定

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(); 

      } 
     } 
    } 

答えて

0

:新しいDataGridCellInfo

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

コードを作成しようとすると、現在のコードは、以下の私にエラーを与えます。

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; 
    } 

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

public Object[] Cell 
{ 
    get; 
    set; 
} 
プロパティ

バインディング、以下のようなあなたのXAMLを設定しました
関連する問題