我尝试了几个小时来寻找不同的混乱“解决方法”并解决问题,但一无所获。我有一个 DataGrid,其中 itemsource 绑定到 ObservableCollection,SelectedItem 绑定到 viewmodel 中的属性。我的问题是每次我的 ObservableCollection 更改时,它当然都会向视图发送 propertychanged 事件,但由于某种原因,焦点完全从数据网格中移除。因此,这会产生丢失所选项目且无法聚焦的问题。如果视图模型中的某个属性为 true,当数据网格失去焦点时,我开始尝试将焦点设置回数据网格上。我尝试在带有焦点管理器和后面代码的样式触发器中执行此操作,但它似乎不起作用。我的项目是相当大的 atm,所以我创建了一个 git 存储库,其中包含此行为的最小示例,它链接在底部。
这是我尝试将焦点重新设置在数据网格上的样式,但它似乎没有做任何事情
<Style x:Key="FocusableDataGrid" TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding Populated}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
我也尝试过从代码后面改变焦点,但我无法让它工作。
对我来说,一个大问题是,我在触发 CellEditEnding 后更新列表,这意味着在编辑组合框后,我只是丢失 SelectedItem 和焦点,在编辑文本框后,如果按 Enter 键,我会丢失所选项目,但不会丢失焦点(SelectedItem 会丢失)从 null 到第一项),但如果我按 Tab 或 esc 或其他任何东西,我都会失去 SelectedItem 和焦点。这种行为非常烦人,希望有办法解决它。再次重申,这些行为可以在链接的 git 存储库中看到。
显然,当 itemscontrol 发送 OnPropertyChanged 信号(没有对源进行实际更改的事件)时,DataGrid 上的 IsAsync 属性设置为 true 会导致整个控件刷新。我使用 IsAsync 希望它能加快在选项卡之间切换时的加载时间,但没有意识到这种行为...... 我对此一无所知,我什至没有将其包含在我的测试存储库中,认为它不会对其产生一点影响。
当失去焦点时,意味着ViewModel发生变化