2013-07-02 4 views
0

전적으로 MVVM을 기반으로하는 응용 프로그램에서 작업하고 있습니다. 나는 바인딩 문제에 직면하고있다.바인딩에서 WPF 부모 자식 관계

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 : Path = DataContext.RemoveSecurity; DataItem = null; 대상 요소는 'MenuItem'(Name = ''); 대상 속성이 'Command'(유형 'ICommand')입니다. –

답변

1

가의 ContextMenu에 조상을 연결할 수있는 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에 있음), Bridge와 같이 Tag를 사용해야합니다. –

+0

확인. 그것은 꽤 분명했습니다. 답장을 보내 주셔서 감사합니다. –

2

ContextMenu은 다른 시각적 트리에서 작동하므로 그렇게 바인딩 할 수 없습니다. ContextMenu 조상을 찾고 명령을 검색하려면 PlacementTarget.DataContext을 참조해야합니다.

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