1

旧标题:GridView SelectCell + 焦点/编辑中的不一致操作(GridView 重新加载了两次?)

我正在开发一个在 Expander 的 Content 属性中设置的 GridView(由数据绑定)。当我打开扩展器时,我希望第三列,第一个元素被选中和编辑(但简单地聚焦也是可以接受的)。当我尝试将此功能添加到附加到扩展的此操作中时,网格从未为我选择第一个项目。我做了一些故障排除,奇怪的是,我注意到发生了一些事情。Expander 是 ItemsCollection 中模板的一部分,因此每次我向此 ItemsCollection 添加新项目时,都会在屏幕上创建一个 Expander(预设为 IsExpanded = false)。我为 Expander_Expanded 事件和 DataGrid.Loaded 事件设置了 Debug.WriteLine,以便让我知道事件何时发生。这是这两个事件的代码。

数据网格加载:

DataGrid dg = sender as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();

Expander.扩展:

Expander expander = sender as Expander;
DataGrid dg = expander.Content as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();

当我创建一个包含 Expander 的项目并显示在屏幕上时,DataGrid.Loaded 事件会触发。第一次展开扩展器时,会触发 Expander.Expanded 事件以及 DataGrid.Loaded。此后每隔一次,只会触发 Expander.Expanded 事件。

第一次,[0][2] 处的单元格被聚焦并处于编辑模式。每隔一段时间,不会选择/聚焦任何单元格。如果 DataGrid.Loaded 事件中没有代码,则无论是否第一次打开 Expander,Cell 都不会被聚焦或处于编辑模式。Expander.Expanded 实际上似乎并没有做任何事情,选择明智的。作为记录,DataGrid 的绑定工作完美,无论我何时进行更改(无论是第一次打开 Expander 还是随后的任何时间),数据都会正确更新。谁能解释一下?

更新:

经过进一步调查,它与 GridLoaded 事件的关系不如与 Keyboard.Focus 的关系大。第一次加载 DataGrid 时,键盘焦点转到我要求的单元格(以文本框的形式)。但是,每次之后,键盘焦点仍然在打开 Expander 本身的 ToggleButton 上。尝试设置 Keyboard.Focus(dgCell) 或 Keyboard.Focus(dg) 似乎没有做任何事情,即使它们都是可聚焦的。我设法通过在打开 DataGrid 时点击“输入”按钮来验证这个假设。如果 DataGrid 具有键盘焦点,则 enter 将移动到下一行。如果 ToggleButton 具有焦点,它将折叠 Expander。

如前所述,第一次打开 Expander 时,DataGrid 具有键盘焦点,但每隔一次,焦点总是以按钮结束。有什么建议么?

4

1 回答 1

3

我通过调用稍后的事件解决了这个问题。使用扩展器触发了 Keyboard.Focus 切换到在扩展操作发生后切换扩展器的按钮(这使我的焦点切换工作无效)。所以我使用了 Expander_SizeChanged 并添加了一个检查以确保事件是由 Expander 打开而不是由窗口本身的变化触发的。在这里设置焦点并选择我想要解决的单元格。

这是使它工作的代码(expandSomething 是在 Expander_Expanded 事件侦听器上触发的布尔值)。

Expander expander = sender as Expander;
if (expander.IsExpanded && expandSomething)
{
    expandSomething = false;
    DataGrid dg = expander.Content as DataGrid;
    dg.Focus();
    if (dg.SelectedCells.Count == 0)
    {
        dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
        dg.SelectedCells.Add(dg.CurrentCell);
    }
    else
    {
        dg.CurrentCell = dg.SelectedCells[0];
    }
}    
于 2011-08-31T18:49:05.927 回答