Связывание видимости контекстного меню WPF UserControl - PullRequest
5 голосов
/ 16 октября 2011

Видимость контекстного меню моего пользовательского элемента управления не может привязать свойство зависимости.Любая идея?

Вот мой код WPF

<UserControl.ContextMenu>
    <ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">
    <MenuItem Command="local:GCommands.Edit" />
    <MenuItem Command="local:GCommands.Delete" />
    <MenuItem Command="local:GCommands.ExportFcsFiles" />
    <MenuItem Command="local:GCommands.BatchExportStatistics" />
    <Separator/>
    <MenuItem Command="local:GCommands.SaveAs" Header="Save As..." />
    </ContextMenu>
</UserControl.ContextMenu>

Если я установлю Visibility = "Hidden", он будет работать для меня.как это:

<ContextMenu Visibility="Hidden"/>

Если использовать это, оно не будет работать

<ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">

Я уверен, что Visibility = "{Binding ElementName = wellControl, Path = IsInCompactMode, Converter = {StaticResource BooleanToVisibilityConverter}} "не имеет проблем, потому что это работает для других.

вот мое свойство зависимости

public bool IsInCompactMode
        {
            get {return (bool)GetValue(IsInCompactModeProperty); }
            set {SetValue(IsInCompactModeProperty, value); }
        }
        public static readonly DependencyProperty IsInCompactModeProperty =
            DependencyProperty.Register("IsInCompactMode", typeof(bool), typeof(WellControl), new PropertyMetadata(false));

Я пробовал таким образом, кажется, это все еще не работает, этодействительно странно !!!

<ContextMenu x:Name="menu" IsOpen="{Binding ElementName=wellControl, Path=IsInCompactMode}"> 

Я действительно смущен этим, что не так?«Binding ElementName = wellControl, Path = IsInCompactMode» работает для другой части пользовательского элемента управления, просто не работает для странного контекстного меню?это не имеет смысла

Ответы [ 3 ]

9 голосов
/ 17 октября 2011

1> ContextMenu, Popups, DataGridColumns не являются частью визуального дерева.Таким образом, привязка с использованием ElementName или RelativeSource не будет работать именно так.

2> Если вы хотите, чтобы контекстное меню не отображалось в конкретной ситуации, используйте триггеры, чтобы сбросить контекстное меню изсам Visual.

      <TextBlock Text="ContextMenu is not shown when DataContext.IsShow is false"}">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="ContextMenu"
                            Value="{StaticResource TextBlockContextMenu}" />
                   <Style.Triggers>
                       <DataTrigger Binding="{Binding IsShow}"
                                    Value="False">
                            <Setter Property="ContextMenu"
                                    Value="{x:Null}" />
                       </DataTrigger>   
                   </Style.Triggers>
                </Style>
            </TextBlock.Style>
      </TextBlock>

3> Чтобы прикрепить эти элементы к дереву визуалов, чтобы связывание работало, мы используем метод прокси-элемента ...

BindВидимость столбца таблицы данных MVVM

Я предпочитаю второй шаг.

0 голосов
/ 16 ноября 2017

Вы должны добавить триггер обновления: «UpdateSourceTrigger = PropertyChanged»

<DataGrid.ContextMenu >
    <ContextMenu Visibility="{Binding IsSelectionEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource BooleanToVisibilityConverter}}" >
        <ContextMenu.Items>
            <MenuItem Header="Create Layer" Command="{Binding DefineLayerName }" />
        </ContextMenu.Items>
    </ContextMenu>
</DataGrid.ContextMenu>
0 голосов
/ 16 октября 2011

Если вы пытаетесь показать / скрыть контекстное меню, вам следует использовать свойство IsOpen ContextMenu, а не свойство Visibility.

...