我在 wpf 树视图上使用上下文菜单,我几乎在那里我想要什么。在解释问题之前,让我解释一下上下文菜单的 XAML 定义在做什么。
对于上下文菜单中的每个菜单项,我们都有一个基于命令 CanExecute 方法禁用或启用菜单项的命令。每个命令都会根据 CanExecute 的结果设置相应菜单项的 IsEnabled 属性。
每个菜单项的 IsEnabled 都绑定到 BooleanToVisibilityConverter,它将 IsEnabled 布尔值转换为 Collapse 或 Visible 值以绑定菜单项的 Visibility 属性。这再次正常工作,我的菜单项显示和隐藏都很好。
现在解决问题。在下面的 XAML 中,我们在分隔符上方有两个菜单项(addCategoryMenuItem 和 removeCategoryMenuItem)。我正在尝试通过 IMultiValueConverter (MultiBooleanToVisibilityConverter) 的自定义实现对这两个菜单项的 IsEnabled 属性进行 MultiBinding,以便当禁用这两个菜单项时,我可以将 Separator 的 Visibility 属性设置为折叠,从而在菜单项被禁用。
对于我的 Converter(MultiBooleanToVisibilityConverter) 中的 Convert 方法,参数值(对象 [] 值)我在数组中获得了两个包含值“{DependencyProperty.UnsetValue}”的项目。这些不能转换为布尔值,因此无法计算出我的 Visibility 值。
可能与 MultiBinding 中使用的 ElementName 有关。它找不到元素吗?我曾尝试使用RelativeSource,即查找祖先等。但我只是感到困惑。我已经花了几个小时在这上面,所以现在我把它留给了社区。
亲切的问候
穆罕默德
<ContextMenu x:Key="CategoryMenu">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type Control}">
<Setter Property="Visibility" Value="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource booleanToVisibilityConverter}}" />
</Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.Items>
<MenuItem x:Name="addCategoryMenuItem" Header="add category" Command="{Binding AddCategory}">
<MenuItem.Icon>
<Image Source="/Images/add.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem x:Name="removeCategoryMenuItem" Header="remove category" Command="{Binding RemoveCategory}">
<MenuItem.Icon>
<Image Source="/Images/remove.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
<Separator>
<Separator.Visibility>
<MultiBinding Converter="{StaticResource multiBooleanToVisibilityConverter}">
<Binding Mode="OneWay" ElementName="addCategoryMenuItem" Path="IsEnabled" />
<Binding Mode="OneWay" ElementName="removeCategoryMenuItem" Path="IsEnabled" />
</MultiBinding>
</Separator.Visibility>
</Separator>
<MenuItem x:Name="refreshCategoryMenuItem" Header="refresh" Command="{Binding RefreshCategory}">
<MenuItem.Icon>
<Image Source="/Images/refresh.png" Width="16" Height="16" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu.Items>
</ContextMenu>