我无法弄清楚我在哪里出错了。希望你们中的一个可以提供帮助。
我有一个包含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吗?这可能会打破这个窗口的其他部分。
答案 0 :(得分:2)
是的,无论您的“TopMost”属性所在的对象都必须设置为窗口的DataContext。如果将其设置为Window的DataContext,那么您的控件应该能够从您在第一个示例中尝试过的ElementName绑定中拾取属性。
您的视图将查看其DataContext中名为“TopMost”的属性
答案 1 :(得分:0)
据我所知,菜单是在弹出窗口中绘制的,而弹出窗口实际上并不是窗口可视树的一部分。所以最好尝试在这里使用MVVM并通过视图模型设置IsChecked。