我有一个WPF DataGrid,其中一些数据绑定到LINQ to SQL实体类。一列是显示给定航班的空中时间的时钟,它是使用Flight的部分类中的逻辑计算的。我有一个定时器,每隔2秒调用datagrid.Items.Refresh来更新时钟。
刷新工作正常,但现在我正在添加键盘快捷键。使用键盘箭头在单元格中导航可以正常关闭计时器,但启用刷新计时器后,聚焦单元格(实际上是整个数据网格)将失去焦点。
我需要以某种方式保持焦点(首选)或在DataGrid聚焦时禁用计时器。我甚至无法让后者工作。我试过了:
if (!dataGrid.IsFocused)
dataGrid.Items.Refresh();
和
if (!dataGrid.IsKeyboardFocused)
dataGrid.Items.Refresh();
表示计时器,但即使数据网格被聚焦,这些属性也会返回false。
有什么想法吗?
答案 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,则可以记住SelectedItem
或SelectedIndex
并在通过绑定完成重新加载后恢复它。这将使你进入正确的行,一开始。两者都有不同的缺点:
SelectedItem
需要更多工作。如果您使用它,请确保覆盖基础对象中的Equals
和GetHashCode
。如果你的项目在集合中是第5位,并且在重新加载期间会出现另一行,那么你仍然会在最右边的行中结束SelectedIndex
是最快的解决方案,但只是一个数字位置。如果您选择条目号5并且重新加载合并在它之前的行中,您将最终选择错误的行。正如我所说,我没有尝试使用单元格,但您可以阅读this作为开始。也许你可以将它应用到你的问题中。