无法将可检查的MenuItem绑定到父窗口的Topmost(始终在顶部)属性

时间:2012-04-05 21:46:51

标签: c# wpf data-binding relativesource findancestor

我无法弄清楚我在哪里出错了。希望你们中的一个可以提供帮助。

我有一个包含TabControl的窗口。 TabControl有一个ContextMenu,其中包含一个可检查的项目,用于" always-on-top"行为。我想将此可检查项绑定到包含Window的boolean 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位于Window&#34; myWindow&#34 ;?我是否需要使用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 个答案:

答案 0 :(得分:2)

是的,无论您的“TopMost”属性所在的对象都必须设置为窗口的DataContext。如果将其设置为Window的DataContext,那么您的控件应该能够从您在第一个示例中尝试过的ElementName绑定中拾取属性。

您的视图将查看其DataContext中名为“TopMost”的属性

答案 1 :(得分:0)

据我所知,菜单是在弹出窗口中绘制的,而弹出窗口实际上并不是窗口可视树的一部分。所以最好尝试在这里使用MVVM并通过视图模型设置IsChecked。