2

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

我有一个包含 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 还是什么?这可能会破坏此窗口的其他部分。

4

2 回答 2

2

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

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

于 2012-04-05T21:59:52.160 回答
1

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

于 2012-04-05T21:55:06.513 回答