2012-04-05 17 views
2

我無法弄清楚我要去哪裏錯了。希望你們中的一個人能夠提供幫助。麻煩綁定一個可檢查的MenuItem到父窗口的最頂端(總是在上面)屬性

我有一個包含TabControl的窗口。 TabControl有一個ContextMenu,其中包含一個用於「永遠在上」行爲的可檢查項目。我想將這個可檢查項綁定到包含Window的布爾型最頂層屬性。

不管我做什麼,綁定失敗,我得到一個「無法找到綁定源」錯誤在我的調試輸出。

(摘錄這些極大地從我的實際代碼簡化我希望我沒有不小心切出任何相關信息。)

首先我嘗試這樣:

<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祖先綁定嗎?

所以,我想這一點:

<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。如果它被設置爲你的Window的DataContext,那麼你的控件應該能夠從你在第一個例子中試過的ElementName綁定中拾取屬性。

你的觀點會看看它的DataContext名爲財產「層次最高的」

+0

DataContext和ElementName之間的關係是什麼?看起來他們都做同樣的事情,不是嗎? – 2012-04-05 22:12:35

+0

DataContext是表示視圖的後備屬性的對象。任何簡單的綁定表達式都會在其DataContext上查找綁定到的屬性。 ElementName綁定意味着您將元素的屬性綁定到另一個元素的屬性(如將文本框的text屬性綁定到按鈕的content屬性)。 – KodeKreachor 2012-04-05 22:20:14

+0

我還沒有關注。我** **「將一個元素的屬性綁定到另一個元素的屬性」(也就是說,我將MenuItem.IsChecked綁定到myWindow.Topmost)。 DataContext的用途是什麼?爲什麼它看起來不是我給出的顯式ElementName以外的任何地方? – 2012-04-05 22:29:11

0

據我記得菜單是在一個彈出窗口中繪製的,它實際上並不是窗口的可視化樹的一部分。所以最好在這裏嘗試使用MVVM並通過視圖模型設置IsChecked。

+0

這可以解釋爲什麼FindAncestor可能無法正常工作,然而不知其所以然的ElementName不起作用。 – 2012-04-05 21:59:52

相關問題