ElementName привязка из MenuItem в ContextMenu

Кто-нибудь еще заметил, что Bindings с ElementName не корректно разрешают объекты MenuItem , которые содержатся в объектах ContextMenu ? Проверьте этот образец:

           

Все привязки отлично работают, за исключением привязок, содержащихся в ContextMenu. Они печатают ошибку в окне «Выход» во время выполнения.

Кто-нибудь знает о любой работе вокруг? Что тут происходит?

Я нашел гораздо более простое решение.

В коде для UserControl:

 NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this)); 

Вот еще один способ обхода xaml. (Это также предполагает, что вы хотите, что внутри DataContext , например, вы MVVMing )

Вариант один, где родительский элемент ContextMenu не находится в DataTemplate :

 Command="{Binding PlacementTarget.DataContext.MyCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" 

Это будет работать для вопроса ОП. Это не будет работать, если вы находитесь внутри DataTemplate . В этих случаях DataContext часто является одним из многих в коллекции, а ICommand, к которому вы хотите привязать, является родственным свойством коллекции в той же ViewModel (например, DataContext of Window).

В этих случаях вы можете воспользоваться тегом для временного хранения родительского DataContext, который содержит как коллекцию, так и вашу ICommand:

 class ViewModel { public ObservableCollection Derps { get;set;} public ICommand DeleteDerp {get; set;} } 

и в xaml

       

Как сказано другими, «ContextMenu» не содержится в визуальном дереве, а привязка «ElementName» не будет работать. Настройка «NameScope» контекстного меню, предложенная принятым ответом, работает только в том случае, если контекстное меню не определено в «DataTemplate». Я решил это с помощью расширения {x: Reference} Markup-Extension, которое похоже на привязку «ElementName», но решает привязку по-разному, минуя визуальное дерево. Я считаю это более читаемым, чем использование «PlacementTarget». Вот пример:

        

Согласно документации MSDN

x: Ссылка – это конструкция, определенная в XAML 2009. В WPF вы можете использовать функции XAML 2009, но только для XAML, который не скомпилирован WPF. Компилируемая по методу XAML и форма BAML XAML в настоящее время не поддерживают ключевые слова и функции языка XAML 2009.

что бы это ни значило … Работает для меня.

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

Попробуйте настроить datacontext вашего контекстного меню на цель размещения. Вы должны использовать RelativeSource.

  ... 

После нескольких экспериментов я обнаружил одну работу:

Сделайте верхний уровень Window / UserControl реализуйте INameScope и установите NameScope of ContextMenu в элемент управления верхнего уровня.

 public class Window1 : Window, INameScope { public Window1() { InitializeComponent(); NameScope.SetNameScope(contextMenu, this); } // Event handlers and etc... // Implement INameScope similar to this: #region INameScope Members Dictionary items = new Dictionary(); object INameScope.FindName(string name) { return items[name]; } void INameScope.RegisterName(string name, object scopedElement) { items.Add(name, scopedElement); } void INameScope.UnregisterName(string name) { items.Remove(name); } #endregion } 

Это позволяет контекстному меню находить именованные элементы внутри Window . Любые другие варианты?

Я не уверен, зачем прибегать к волшебным трюкам, чтобы избежать одной строки кода внутри обработчика событий для мыши, с которой вы уже справляетесь:

  private void MenuItem_Click(object sender, System.Windows.RoutedEventArgs e) { // this would be your tag - whatever control can be put as string intot he tag UIElement elm = Window.GetWindow(sender as MenuItem).FindName("whatever control") as UIElement; } 
  • Похоже, что привязки данных не обновляются
  • Image UriSource и привязка данных
  • Как правильно привязать xml к WPF DataGrid?
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Можно ли связать свойство Canvas's Children в XAML?
  • Перетаскивание из источника данных в окно WPF не работает
  • ItemsControl с несколькими DataTemplates для viewmodel
  • Привязка OneWayToSource от свойства readonly в XAML
  • Как я могу привязать данные строк к ListBox в WPF / WP7?
  • Когда следует использовать # и = в элементах управления ASP.NET?
  • Каковы различные режимы привязки WPF?
  • Давайте будем гением компьютера.