WPF如何让DataGrid的TemplateColumn内ComboBox随DataGrid加载初始化
你遇到的卡顿并非ComboBox数据源加载或者渲染导致,从调试日志可以判断,是首次点击ComboBox时触发了WPF无障碍辅助功能相关的dll动态加载,才出现数秒卡顿,你的5条数据量完全不需要用到UI虚拟化,所以之前的优化方案不生效。
以下是可行的解决方案:
- 方案1:预加载辅助功能相关依赖
在窗口构造函数InitializeComponent执行后,主动触发相关程序集的加载,避免用户交互时才加载:
public TestWindow() { InitializeComponent(); // 新增以下两行预加载依赖 _ = typeof(System.Windows.Automation.Peers.ComboBoxAutomationPeer); System.Reflection.Assembly.Load("Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); var _context = new TestContext(); DataContext = _context; TestDataGrid.ItemsSource = _context.Atms; }
这段代码会在窗口初始化阶段就完成相关程序集的加载,用户点击ComboBox时不会再触发加载逻辑,卡顿自然消失。
- 方案2:禁用WPF辅助功能(如果你的程序不需要适配读屏等无障碍功能)
在项目的App.config文件中加入以下配置,直接禁用UI自动化相关逻辑,不会再加载对应的dll:
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.Windows.Automation.DisableUIAutomation=true" /> </runtime> </configuration>
如果是.NET Core 3.x版本,上述配置不生效的话,可以换成以下配置:
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=true;Switch.UseLegacyAccessibilityFeatures.2=true;Switch.UseLegacyAccessibilityFeatures.3=true;Switch.UseLegacyAccessibilityFeatures.4=true" /> </runtime> </configuration>
- 方案3:优化ComboBox绑定逻辑
你当前用RelativeSource找Window级的DataContext,每次模板解析时都要遍历视觉树,你可以把数据源提前封装为静态资源提升解析效率:
首先在Window的资源块中声明集合源:
<Window.Resources> <CollectionViewSource x:Key="DriversCollection" Source="{Binding Drivers}" /> </Window.Resources>
然后修改ComboBox的ItemsSource绑定:
<ComboBox ItemsSource="{Binding Source={StaticResource DriversCollection}}" SelectedValuePath="Initials" DisplayMemberPath="Initials" SelectedValue="{Binding Initials, Mode=TwoWay}"> <!-- 其余配置保持不变 --> </ComboBox>
内容的提问来源于stack exchange,提问作者eleviness
相关产品推荐
相关产品推荐

