Недавно я разрабатываю контекстное меню в WPF со следующим требованием,
Если все пункты меню в контекстном меню имеют скрытую видимость, установите видимость контекстного меню на Скрытая.
У меня есть решение для этого в DataTemplate, которое должно установить ContextMenu Hidden по умолчанию, и использовать Trigger для каждого пункта меню, чтобы проверить их видимость, если какой-либо из них является видимым, вызвать видимость ContextMenu в visible.
Таким образом, код похож на
<DataTemplate>
<ContextMenu Visibility="Hidden" x:Name="contextMenu">
<MenuItem x:Name="menuItem1" Visibility="{Binding somebinding}" />
<MenuItem x:Name="menuItem2" Visibliity="{Binding somebinding}" />
</ContextMenu>
<DataTemplate.Trigger>
<Trigger SourceName="menuItem1" Propert"Visibility" Value="Visible">
<Setter TargetName="contextMenu" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger SourceName="menuItem2" Propert"Visibility" Value="Visible">
<Setter TargetName="contextMenu" Property="Visibility" Value="Visible" />
</Trigger>
</DataTemplate.Trigger>
</DataTemplate>
Моя проблема в том, что это действительно зависит от элемента управления, которому принадлежит это контекстное меню (в данном случае это DataTemplate). На самом деле мы хотим сделать это поведение контекстного меню независимым и поместить его в ресурс, чтобы другие элементы управления могли делиться с ним.
Я пытаюсь сделать это в триггере стиля самого контекстного меню, но в триггере стиля я не могу использовать имя цели и имя источника.
Может кто-нибудь помочь мне придумать лучшее решение? Спасибо.
S.
UPDATE:
Глядя на примеры в ссылке от Николая, я реализовал конвертер, как показано ниже
<ContextMenu x:Name="contextMenu" Visibility={Binding PATH=Items, Converter={StaticResource Converter}>
<MenuItem x:Name="menuItem1" Visibility="{Binding somebinding}" />
<MenuItem x:Name="menuItem2" Visibliity="{Binding somebinding}" />
</ContextMenu>
В конвертере он проверяет видимость каждого пункта меню и устанавливает правильное значение видимости контекстного меню.
Но проблема, которую я обнаружил, заключается в том, что WPF оценивает привязки сверху вниз, поэтому сначала выполняется ContextMenu, а затем MenuItem, в этом случае мой конвертер не работает, поскольку во время привязки элементы все еще отсутствуют. ,
Какие-нибудь советы, ребята?