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