Проблема с привязкой проверяемого MenuItem к свойству Topmost (всегда сверху) родительского окна
Я не могу понять, где я иду не так здесь. Надеюсь, один из вас может помочь.
У меня есть окно, которое содержит TabControl. В TabControl есть ContextMenu с проверяемым элементом для поведения "всегда сверху". Я хочу привязать этот проверяемый элемент к булевому свойству Topmost содержащего окна.
Независимо от того, что я делаю, привязка завершается неудачно, и в моих результатах отладки я получаю ошибку "Не удается найти источник для привязки".
(Эти выдержки значительно упрощены из моего реального кода. Надеюсь, я случайно не вырезал что-то важное.)
Сначала я попробовал это:
<Window x:Name="myWindow" (blah blah other properties)>
<TabControl x:Name="tabControl">
<TabControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Always on Top" IsCheckable="True"
IsChecked="{Binding ElementName=myWindow,
Path=Topmost,
Mode=TwoWay}"/>
</ContextMenu>
...
Это не сработало. Это потому, что MenuItem находится внутри окна "myWindow"? Нужно ли использовать привязку RelativeSource Ancestor?
Итак, я попробовал это:
<Window x:Name="myWindow" (blah blah other properties)>
<TabControl x:Name="tabControl">
<TabControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Always on Top" IsCheckable="True"
IsChecked="{Binding RelativeSource={
RelativeSource FindAncestor,
AncestorType={x:Type Window}
},
Path=Topmost,
Mode=TwoWay}"/>
</ContextMenu>
...
Это тоже не сработало.
Так что теперь я застрял. Как мне сделать эту привязку работать?
Примечание. Мой программный код ничего не делает с этими элементами. Мне нужно установить Window.DataContext или что-то? Это может сломать другие части этого окна.
2 ответа
Да, любой объект, на котором находится свойство TopMost, должен быть установлен как DataContext вашего окна. Если он установлен в качестве DataContext вашего окна, то ваш элемент управления должен иметь возможность забрать свойство из привязки ElementName, которую вы пробовали в первом примере.
Ваше представление будет смотреть на свой DataContext для свойства с именем "TopMost"
Насколько я помню, меню нарисовано во всплывающем окне, которое на самом деле не является частью визуального дерева окна. Поэтому здесь лучше попробовать использовать MVVM и установить IsChecked через модель представления.