Могу ли я реализовать такое правило в контекстном меню WPF в XAML? - PullRequest
1 голос
/ 30 марта 2012

Недавно я разрабатываю контекстное меню в 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, в этом случае мой конвертер не работает, поскольку во время привязки элементы все еще отсутствуют. ,

Какие-нибудь советы, ребята?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2012

Решение с конвертером не работает, потому что вы привязываете видимость контекстного меню к элементам, но коллекции элементов никогда не меняются после загрузки, а привязка не переоценивается, тогда видимость изменений подэлемента.

Я не вижулюбые простые способы добиться этого только в Xaml, но вы можете легко сделать это с помощью кода.Например, вы можете наследовать ContextMenu, а в производном классе вы можете подписаться на изменения видимости всех подэлементов (через уведомления об изменении свойств зависимостей) и соответственно изменить его видимость.

Хакерский способ сделать это только в xaml -используйте multibinding для ContextMenu.Visibility и привязывайте оба элемента и ваш somebinding, но на самом деле используйте только элементы.Таким образом, wpf будет вызывать ваш конвертер видимости каждый раз, когда что-то меняется.

0 голосов
/ 30 марта 2012

посмотрите на следующий пост, он даст вам идеи. Видимость переключается на разные элементы управления, но подход будет аналогичным.

Реализация "Rename" из ContextMenu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...