刷新WPF DataGrid而不会丢失单元格焦点

时间:2011-03-26 14:07:23

标签: wpf datagrid timer focus refresh

我有一个WPF DataGrid,其中一些数据绑定到LINQ to SQL实体类。一列是显示给定航班的空中时间的时钟,它是使用Flight的部分类中的逻辑计算的。我有一个定时器,每隔2秒调用datagrid.Items.Refresh来更新时钟。

刷新工作正常,但现在我正在添加键盘快捷键。使用键盘箭头在单元格中导航可以正常关闭计时器,但启用刷新计时器后,聚焦单元格(实际上是整个数据网格)将失去焦点。

我需要以某种方式保持焦点(首选)或在DataGrid聚焦时禁用计时器。我甚至无法让后者工作。我试过了:

if (!dataGrid.IsFocused)
    dataGrid.Items.Refresh();

if (!dataGrid.IsKeyboardFocused)
        dataGrid.Items.Refresh();

表示计时器,但即使数据网格被聚焦,这些属性也会返回false。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

最好的方法是不要使用dataGrid.Items.Refresh()作为更新机制。听起来底层对象已经单独更新。如果它们实现了INotifyPropertyChanged,您应该尝试将列的绑定模式设置为TwoWay绑定:

<DataGridTextColumn Binding="{Binding xyz, Mode=TwoWay}"/>

答案 1 :(得分:0)

我认为您可能会获得当前的焦点,并且在网格刷新后,将所选单元格重新调整为焦点,如

int index = 11;
myDataGrid.SelectedItem = myDataGrid.Items[index];
myDataGrid.ScrollIntoView(myDataGrid.Items[index]);
DataGridRow dgrow = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.Items[index]);
dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

同时检查this它可能会对您有所帮助

答案 2 :(得分:0)

您的单元格失去焦点,因为您更改了基础集合(ItemsSource)。据我所知,没有美丽的方式来获得牢房。对于行:

如果您使用MVVM,则可以记住SelectedItemSelectedIndex并在通过绑定完成重新加载后恢复它。这将使你进入正确的行,一开始。两者都有不同的缺点:

  • SelectedItem需要更多工作。如果您使用它,请确保覆盖基础对象中的EqualsGetHashCode。如果你的项目在集合中是第5位,并且在重新加载期间会出现另一行,那么你仍然会在最右边的行中结束
  • SelectedIndex是最快的解决方案,但只是一个数字位置。如果您选择条目号5并且重新加载合并在它之前的行中,您将最终选择错误的行。

正如我所说,我没有尝试使用单元格,但您可以阅读this作为开始。也许你可以将它应用到你的问题中。