Ответ 1
Проблема заключается в том, что ContextMenu по-видимому, корень собственного визуального дерева. Я где-то читал, что он берет datacontext его родительский элемент, но только один раз при загрузке, поэтому if родители datacontext меняют элементы меню. (к сожалению, я не могу найти ссылку для этого права)
Я столкнулся с этой проблемой раньше, и то, что я сделал, было использовать Josh Smith Virtual Branch Pattern. Это довольно технически, но статья помогла мне очень хорошо понять, что происходит с этим визуальным деревом.
По существу вы создаете этот мост, который привязывается к представлению datacontext. Мост создается как статический ресурс, что позволяет вам привязываться к нему из контекстного меню, даже если оно находится вне визуального дерева.
Добавьте это в свой xaml:
<Window.Resources>
<!-- This is the "root node" in the virtual branch
attached to the logical tree. It has its
DataContext set by the Binding applied to the
Window DataContext property. -->
<FrameworkElement x:Key="DataContextBridge" />
</Window.Resources>
<Window.DataContext>
<!-- This Binding sets the DataContext on the "root node"
of the virtual logical tree branch. This Binding
must be applied to the DataContext of the element
which is actually assigned the data context value. -->
<Binding
Mode="OneWayToSource"
Path="DataContext"
Source="{StaticResource DataContextBridge}"
/>
</Window.DataContext>
Это мост, о котором я говорил. Он берет datacontext и __pushes it_ к моменту datacontext мостов, который (как я сказал ранее) статический ресурс.
Затем вы просто это примените к контекстному контексту datacontext:
DataContext="{Binding
Source={StaticResource DataContextBridge},
Path=DataContext}"
Теперь выбросьте все относительные пути и т.д. и используйте регулярное связывание внутри элементов меню, и все должно быть в порядке. Datacontext будет обновляться, как обычно.
Только одно примечание:
Очевидно, вам придется иметь какое-то свойство в datacontext, чтобы определить, какую команду использовать, но я уверен, что вы можете понять это. Это решение просто связано с тем, как контекстное меню не обновляет