2016-03-14 121 views
0

好吧,夥計們。我已經嘗試了大約3天,並沒有任何數量的谷歌搜索幫助。下面是我的XAML的片段(應該足以跟上)。 我的問題是「ContextMenu」的命令。 正如你所見,我有DeleteTagCommand。現在,如果我把它放在CheckBoxCommand的位置上,那麼這個命令就可以工作,這很棒..但是它只是在當前位置被調用,而且它讓我瘋狂。綁定命令 - 祖先

 <ScrollViewer Grid.Column="0"> 
      <StackPanel Orientation="Vertical"> 
       <ItemsControl ItemsSource="{Binding Tags, UpdateSourceTrigger=PropertyChanged}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <CheckBox Content="{Binding Value}" Margin="10,5,10,5" Command="{Binding DataContext.CheckBoxCommand, 
                          RelativeSource={RelativeSource FindAncestor, 
                          AncestorType={x:Type Grid}}}" 
            CommandParameter="{Binding }"> 
           <CheckBox.ContextMenu> 
            <ContextMenu> 
             <MenuItem Header="Delete" Command="{Binding DataContext.DeleteTagCommand, 
                        RelativeSource={RelativeSource FindAncestor, 
                        AncestorType={x:Type Grid}}}" 
                CommandParameter="{Binding}" /> 
            </ContextMenu> 
           </CheckBox.ContextMenu> 
          </CheckBox> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </StackPanel> 
     </ScrollViewer> 

我已經試過:

  • 來自全國各地的演出呼喚「的ElementName」,但它從來沒有被拾起
  • 更改「AncestorLevel」淫穢號碼,希望是問題
  • 以及更多......

不知道什麼是對你有用的傢伙,但下面是輸出消息我得到

找不到與參考'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.Grid',AncestorLevel ='1'綁定的源代碼。 BindingExpression:路徑= DataContext.DeleteTagCommand;的DataItem = NULL;目標元素是'MenuItem'(Name ='');目標屬性是「命令」(類型「的ICommand」)

感謝

回答

2

ContextMenus實際上不是相同的視覺樹作爲他們的父母,使他們不能直接綁定到其中的任何元素的一部分。但是,它們仍然可以綁定到StaticResources。訣竅是使用中間代理,如BindingProxy class shown on this page。通過添加一個實例你ItemsControl資源塊開始:

<ItemsControl.Resources> 
    <local:BindingProxy x:Key="Proxy" Data="{Binding}" /> 
</ItemsControl.Resources> 

然後用它來綁定你ContextMenu命令:

<ContextMenu> 
    <MenuItem Header="Delete" Command="{Binding Data.DeleteTagCommand, Source={StaticResource Proxy}}" CommandParameter="{Binding}" /> 
</ContextMenu> 
+0

謝謝。這是我討厭WPF的原因之一。再次,謝謝:) – Oyyou