我正在尝试根据输入的部件号在数据网格中设置单元格的焦点,以便用户可以对部件进行条形码扫描,然后非常快速地编辑该值。现在,我可以在我的项目的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)
答案 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;
}