我有以下XAML菜单项:
<MenuItem Visibility="{Binding SetToSpecificMacroCommand, Converter={StaticResource NullToVisibilityConverter}}"
Header="{x:Static res:Strings.SetToSpecificMacro}" ItemsSource="{Binding AvailableMacros}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Key}" />
<Setter Property="Command" Value="{Binding Command}" />
<Setter Property="CommandParameter" Value="{Binding Key}" />
</Style>
</MenuItem.ItemContainerStyle>
<MenuItem.Icon>
<Image Source="/Resources/Images/Icons/PlaceMacro16.png" />
</MenuItem.Icon>
</MenuItem>
AvailableMacros
属性(绑定到MenuItem
的ItemsSource
)是一个IEnumerable<MacroKeyViewModel>
,最重要的是,它必须保持IEnumerable
,因为它必须在每次菜单打开时重新计算。
菜单项本身除了显示子项之外没有任何用途,因此如果没有可用的子项,我想隐藏它。
我可以用一个转换器将MenuItem
的Visibility
绑定到AvailableMacros
(它会检查是否有可用的),但实际上这个属性会被求值两次,这会减慢UI(特别是我有几个这样的菜单项)。
如果没有子菜单项,我如何隐藏菜单项而不需要计算AvailableMacros
两次?
1条答案
按热度按时间q9yhzks01#
1.你不需要一个完整的通行证,以确定能见度。使用Any()方法检查是否存在至少一个元素就足够了。
1.您也可以在ViewModel的属性中不检查集合本身,而是检查它的表示(CollectionView),它提供了Items属性:
**P.S.**与WPF固有的成本相比,我认为即使是十次收集也不会引入任何明显的额外成本。