2013-03-21 4 views
3

내 WPF 응용 프로그램에는 항목을 선택할 수있는 목록이 있습니다. 그러면 선택한 항목이 추가 상호 작용을 위해 ContentControl에 표시됩니다. 선택한 항목의 유형 (여러 항목이있을 수 있음)에 따라 적절한 DataTemplate이 ContentControl에 사용됩니다. 지금까지는 데이터 처리 비즈니스 응용 프로그램에있어 별다른 문제가 없었습니다.ContextMenu 명령 데이터 소스로 바인딩이 업데이트되지 않습니다.

각 DataTemplate에는 해당 값을 ViewModel 클래스의 특정 속성에 바인딩하는 여러 TextBox 및 기타 컨트롤이 있습니다. 목록에서 다른 항목을 선택하면이 모든 항목이 예상대로 업데이트됩니다. 단추는 ViewModel의 올바른 인스턴스에서 명령을 실행합니다.

명령을 실행하는 컨텍스트 메뉴 항목이 하나 있지만 처음 선택한 항목에 대해서만 작동합니다. 목록에서 같은 유형의 다른 요소를 선택하면 이미로드 된 템플릿보기를 다시 사용하여 컨텍스트 메뉴의 명령이 항상 첫 번째로 선택된 항목에서 실행됩니다. 따라서 바인딩은 ViewModel의 올바른 인스턴스로 업데이트되지 않습니다.

메뉴 항목을 올바른 ViewModel 인스턴스로 사용하는 유일한 방법은 템플릿이 다른보기로 변경되도록 다른 유형의 항목을 선택하는 것입니다. 그런 다음 상황에 맞는 메뉴가 올바르게 업데이트됩니다.

보기의 다른 바인딩과 마찬가지로 메뉴 항목 명령을 업데이트하지 않는 이유는 무엇입니까? 로드 할 때 한 번 가져 오지 만보기의 수명 동안 업데이트되지 않습니다.

답변

4

업데이트하지 않는 명령 바인딩이 아니라 구식 DataContext입니다.

:

여기 http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda

이 그 기사의 관련 부분 : 당신이 바로 검색어를 알면 그리고 이것은 널리 알려진 문제가 여기에

더 링크에 대한 설명입니다 ...입니다

해결 방법은 다음과 같이 명시 적으로 부모의 데이터 컨텍스트에 메뉴의 데이터 컨텍스트를 결합하는 것입니다

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, 
    RelativeSource={RelativeSource Self}}"> 
,

이 마법은 WPF에게 메뉴의 데이터 컨텍스트와 해당 "배치 대상"(즉, 부모) 데이터 컨텍스트는 부모 컨텍스트가 변경된 후에도 계속 작동합니다. 부모의 데이터 컨텍스트가 부모의 삶 동안에 바뀔 것으로 예상되는 경우에만이 주문이 필요합니다.

이전에 찾은 또 다른 해결책은 상황에 맞는 메뉴의 DataContext를 Opened 이벤트의 DataContext에 수동으로 설정하는 것이 었습니다. 코드 숨김 파일에 추가 C# 코드가 필요하며 다른 시나리오에 적용해야 할 수도 있습니다. 그래서 위의 XAML 만 사용하는 것이 더 좋다고 생각합니다.

관련 문제