首先,我完全清楚这个例子是多么做作,而且缺乏虚拟化,但是我用它来演示我在一个更复杂的系统中遇到的问题,这个问题很难节目。这似乎是一种展示它的简单方法。
以下代码创建一个菜单和一个绑定到大型字符串列表的ItemsControl(我使用10,000个),每个都被视为一个按钮。
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="Test">
<MenuItem Header="A" />
<MenuItem Header="B" />
<MenuItem Header="C" />
</MenuItem>
</Menu>
<Expander IsExpanded="True">
<ScrollViewer>
<ItemsControl ItemsSource="{Binding LotsOfStrings}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="Open" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Expander>
</DockPanel>
正如预期的那样,加载速度很慢,但一旦加载,“测试”菜单就会响应(也就是说,当您将鼠标悬停在菜单项上时,没有明显的延迟。)
现在对按钮添加命令进行以下小改动。
<Button Content="Open" Command="Open"/>
现在菜单变得非常迟钝。出于某种原因,将鼠标悬停在不同的菜单项上会调用CommandManager.InvalidateRequerySuggested()
,这会针对每个按钮执行,从而导致速度变慢。
所以我想知道是否还有禁用对不可见控件的命令更新?所以在这个例子中,如果扩展器被折叠,我可以在停止按钮处理命令更新吗?