Проблема с привязкой проверяемого 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 через модель представления.

Другие вопросы по тегам