2011-02-07 1 views
3

ContextMenu에서 어떤 일이 벌어지고 있는지 이해하기가 어렵습니다. 별도의 비주얼 트리가있는 별개의 윈도우로 렌더링된다는 것을 알고 있으므로 상대 바인딩을 사용하여 사용자 정의 컨트롤의 속성으로 노출 된 명령을 바인딩 할 수 없습니다. 예 : 당신은 속성으로 명령을 노출하는 뷰 모델에 사용자 컨트롤의 데이터 컨텍스트를 설정하는 경우, 다음이 작동,WPF ContextMenu 바인딩 MenuItem을 UserControl 속성 대 ViewModel 속성

<MenuItem Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=TestCommand}" Header="Test" /> 

:하지만

<MenuItem Command="{Binding TestCommand}" Header="Test" /> 
다음 하지 작업을 수행

내가 이해할 수없는 것은 ContextMenu가 비주얼 트리의 일부가 아닌 경우 DataContext의 값을 어떻게 상속 받는지입니다. 이 두 예제가 모두 동일하게 작동 할 것으로 기대합니다 (즉, 둘 다 작동하거나 모두 실패 함).

답변

3

두 번째 바인딩은 소위 "상속 컨텍스트"로 인해 작동합니다. 여기에서 읽을 수 있습니다 : http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx. 기본적으로 이는 일부 속성이 소유자 객체의 데이터 컨텍스트를 상속하는 일종의 특별한 경우입니다. 따라서 예를 들어, 상속 컨텍스트는 항상 Freezable (Freezables에 대한 또 다른 흥미로운 기사 : http://drwpf.com/blog/category/freezables/) 유형의 속성에서 작동합니다.

실제로이 기사에서는 ContextMenu에서는 상속 컨텍스트가 작동하지 않지만 버전 4에서는 상속 컨텍스트가 추가되었다고 말합니다. 따라서 실제로는 상속 컨텍스트가 예제에 표시된 것처럼 실제로 작동합니다.