2013-07-02 138 views
0

我正在研究一個完全基於MVVM的應用程序。我面臨一個有約束力的問題。WPF親子關係綁定

<ListView ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.CurrentSecurityList}"> 
<ListView.ContextMenu> 
<ContextMenu> 
    <MenuItem Header="Remove" Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext.RemoveSecurity}"/> 
</ContextMenu> 
</ListView.ContextMenu> 

ListView綁定在這段代碼中工作絕對好,但問題來了,當涉及到MenuItem命令綁定。有人可以解釋我在這裏做錯了什麼。

+1

「但問題就來了」並沒有幫助,什麼問題?對於綁定問題,請查看Visual Studio中的「輸出」窗口,並複製/粘貼它顯示的綁定錯誤。 – ken2k

+0

ContextMenu綁定是一個衆所周知的情況 - 檢查這篇文章作爲其中一個很多人http://stackoverflow.com/questions/1013558/elementname-binding-from-menuitem-in-contextmenu – sll

+0

無法找到綁定參考' RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.UserControl',AncestorLevel ='1''。 BindingExpression:路徑= DataContext.RemoveSecurity;的DataItem = NULL;目標元素是'MenuItem'(Name ='');目標屬性是'命令'(鍵入'ICommand') –

回答

1

將一個標籤ListView中其祖先連接到它的文本菜單:

<ListView ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.CurrentSecurityList}" 
       Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"> 
     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Remove" Command="{Binding PlacementTarget.Tag.DataContext.RemoveSecurity, RelativeSource={RelativeSource 
           AncestorType=ContextMenu}}"/> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
+0

感謝它工作。 你能解釋爲什麼我們必須以這種方式定義標籤嗎? –

+1

MenuItem可以通過ContextMenu的PlacementTarget找到ListView。但是,它無法進一步發現。如果Command綁定的源對象不在ListView上(在你的情況下,它在ListView的祖先的DataContext上),你必須使用標籤,如橋。 –

+0

好的。這很清楚。感謝回覆。 –

2

ContextMenu在不同的視覺樹上工作,所以不可能像這樣綁定它。您需要找到ContextMenu祖先,並參考其PlacementTarget.DataContext來檢索您的命令。嘗試是這樣的:

<MenuItem Header="Remove" Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}},Path=PlacementTarget.DataContext.RemoveSecurity}"/>