将焦点设置为特定的数据网格单元格

时间:2016-06-30 16:48:06

标签: c# wpf datagrid focus cell

我正在尝试根据输入的部件号在数据网格中设置单元格的焦点,以便用户可以对部件进行条形码扫描,然后非常快速地编辑该值。现在,我可以在我的项目的ObservableCollection中找到部件号的索引,但我在尝试将其设置为该网格单元时遇到问题。 grTimeEntries是数据网格的名称。下面的当前代码在尝试创建新的DataGridCellInfo

时给出了错误
    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();

            }
        }
    }

代码:

dat <- rbind(dat, if(exists("old_dat")) old_dat)

1 个答案:

答案 0 :(得分:0)

创建依赖项属性以聚焦单元格将对您有用。

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

将XAML设置如下,

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

绑定属性

public Object[] Cell
{
   get;
   set;
}