Как я могу связать свойство Visibility на MenuItem верхнего уровня с ViewModel - PullRequest
0 голосов
/ 08 сентября 2011

Я использую следующую HierarchicalDataTemplate для привязки коллекции MenuViewModels к элементу управления Menu:

<HierarchicalDataTemplate
    DataType="{x:Type common:MenuViewModel}"
    ItemsSource="{Binding Path=Children}">

    <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Command}"/>
            <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource ResourceKey=boolToCollapsedConverter}}" />
        </Style>
    </HierarchicalDataTemplate.ItemContainerStyle>

    <ContentPresenter
        Content="{Binding Name}"
        RecognizesAccessKey="True" />

</HierarchicalDataTemplate>

Все это работает нормально, однако у меня есть требование удалить определенные пункты меню на основе определенных состояний(например, я могу захотеть показывать меню верхнего уровня «Редактировать» только при активном экране редактирования). Для этого у меня есть свойство IsVisible в MenuViewModel, которое, в свою очередь, связано с помощью преобразователя booleanToVisibility со свойством Visibility MenuItem.(Устанавливается в HierarchialDataTameplate.ItemContainerStyle, который, я думаю, в этом и заключается моя проблема)

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

У меня естьразбил быстрый пример, показывающий проблему здесь (VS2010 .sln)

Мой вопрос: как я могу связать свойство видимости в MenuItem верхнего уровня с ViewModel?

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011
    <Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding Command}"/>
        <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource ResourceKey=boolToCollapsedConverter}}" />
    </Style>


snip...

<Menu DockPanel.Dock="Top" ItemsSource="{Binding Path=MainMenu}" ItemContainerStyle="{DynamicResource MenuItemStyle}"/>
1 голос
/ 08 сентября 2011

Вам нужно применить стиль на более высоком уровне, например, Menu.ItemContainerStyle, это должно повлиять только на верхний уровень, поэтому, если вы хотите повлиять на все элементы, примените его неявно через Style.TargetType через Menu.Resources.

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