Привязка видимости элемента меню к видимости предыдущего элемента меню

#.net #wpf #binding

#.net #wpf #привязка

Вопрос:

Я хочу привязать видимость mnuAddLessonAfter к видимости mnuAddLessonBefore. Кажется, я не могу заставить это работать, т. Е. Установка видимости mnuAddLessonBefore в свернутое значение скрывает только mnuAddLessonBefore, а не mnuAddLessonAfter. Что я делаю не так?

 <TreeView Grid.Column="0"
          HorizontalAlignment="Stretch"
          Name="treeViewLesson"
          VerticalAlignment="Stretch"
          SelectedItemChanged="treeViewLesson_SelectedItemChanged"
          PreviewMouseLeftButtonDown="treeViewLesson_PreviewMouseLeftButtonDown"
          AllowDrop="True"
          Drop="treeViewLesson_Drop"
          MouseMove="treeViewLesson_MouseMove"
          DragEnter="treeViewLesson_DragEnter">

<TreeView.ContextMenu>

  <ContextMenu Name="context_menu_lesson">

    <MenuItem Name="mnuAddLesson"
              Header="Add lesson"
              Click="mnuAddLesson_Click" />

    <MenuItem Name="mnuAddLessonBefore"
              Header="Add lesson before"
              Click="mnuAddLessonBefore_Click" />

    <MenuItem Name="mnuAddLessonAfter"
              Header="Add lesson after"
              Click="mnuAddLessonAfter_Click"
              Visibility="{Binding ElementName=mnuAddLessonBefore, Path=Visibility}" />
  

Редактировать:

Я заметил это в консоли вывода:

Система.Windows.Ошибка данных: 4: Не удается найти источник для привязки со ссылкой ‘ИмяэлемЕнта=mnuAddLessonBefore’. Выражение привязки:Path=Visibility; DataItem=null; целевым элементом является ‘MenuItem’ (Name=’mnuAddLessonAfter’); целевым свойством является ‘Visibility’ (тип ‘Видимость’)

Комментарии:

1. Это должно сработать, я не вижу ничего плохого. Как вы устанавливаете mnuAddLessonBefore видимость в свернутом виде в codebehind в mnuAddLessonBefore_Click ?

2. Видимость mnuAddLessonBefore устанавливается в treeViewLesson_MouseRightButtonDown.

Ответ №1:

Привязывать контекстные меню к ним сложно. Они существуют вне визуального дерева вашего элемента управления, следовательно, они не могут найти имя вашего элемента.

Попробуйте этот обходной путь

  public Window1()
  {
    InitializeComponent();
    NameScope.SetNameScope(context_menu_lesson, NameScope.GetNameScope(this));
  } 
  

Комментарии:

1. Отлично, спасибо, с NameScope. SetNameSpace(… в конструкторе формы привязка работает.