Я использую контекстное меню в дереве wpf, и я в значительной степени понимаю, что я хочу. Прежде чем объяснить проблему, позвольте мне объяснить, что делает определение XAML для контекстного меню.
Для каждого пункта меню в контекстном меню у нас есть команда, которая либо отключает, либо включает пункт меню на основе команд CanExecute. Каждая команда устанавливает свойство IsEnabled соответствующего пункта меню в зависимости от результата CanExecute.
IsEnabled для каждого элемента меню привязан к BooleanToVisibilityConverter, который преобразует значение IsEnabled bool в значение Collapse или Visible, чтобы связать свойство Visibility элемента меню. Это снова работает нормально, и мои пункты меню отображаются и хорошо скрываются.
Теперь о проблеме. В XAML ниже у нас есть два пункта меню (addCategoryMenuItem и removeCategoryMenuItem) над разделителем. Я пытаюсь привязать MultiBinding к свойству IsEnabled этих двух пунктов меню через пользовательскую реализацию IMultiValueConverter (MultiBooleanToVisibilityConverter), чтобы при отключении двух элементов меню можно было свернуть свойство Visibility разделителя и, следовательно, скрыть разделитель, когда пункты меню отключены.
Для метода Convert в моем конвертере (MultiBooleanToVisibilityConverter) значение параметра (значения объекта []) я получаю два элемента в массиве, которые содержат значение "{DependencyProperty.UnsetValue}". Они не могут быть преобразованы в логические значения, и, следовательно, мое значение Visibility не может быть обработано.
Возможно, это как-то связано с ElementName, используемым в MultiBinding. Разве это не может найти элемент? Я пытался использовать 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>