wpf 如何隐藏菜单项,如果它不包含任何子项?

imzjd6km  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(114)

我有以下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属性(绑定到MenuItemItemsSource)是一个IEnumerable<MacroKeyViewModel>,最重要的是,它必须保持IEnumerable,因为它必须在每次菜单打开时重新计算。
菜单项本身除了显示子项之外没有任何用途,因此如果没有可用的子项,我想隐藏它。
我可以用一个转换器将MenuItemVisibility绑定到AvailableMacros(它会检查是否有可用的),但实际上这个属性会被求值两次,这会减慢UI(特别是我有几个这样的菜单项)。
如果没有子菜单项,我如何隐藏菜单项而不需要计算AvailableMacros两次?

q9yhzks0

q9yhzks01#

1.你不需要一个完整的通行证,以确定能见度。使用Any()方法检查是否存在至少一个元素就足够了。
1.您也可以在ViewModel的属性中不检查集合本身,而是检查它的表示(CollectionView),它提供了Items属性:

<MenuItem Header="{x:Static res:Strings.SetToSpecificMacro}" ItemsSource="{Binding AvailableMacros}">
            <MenuItem.Style>
                <Style TargetType="MenuItem">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}"
                                     Value="0">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </MenuItem.Style>
            <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>

**P.S.**与WPF固有的成本相比,我认为即使是十次收集也不会引入任何明显的额外成本。

相关问题