2017-01-30 2 views
0

내 UserControls 함께 DataContexts를 사용하는 방법을 정리하려면 노력하고 현재 TabItem 안에 UserControl databind 부모 창 DataContext 데이터 바인딩해야하는 문제가 실행되고. 당신이 볼 수 있듯이TabItem 부모 창에 데이터 바인딩

enter image description here

는,이 윈도우가 동적으로 "탭"ItemSource를 통해 추가 TabItems을 포함하는있는 TabControl을 소유 : 여기

내 창 같은 모습의 스케치입니다. "탭"이 탭 1로 채워지기 때문에이 시점에서 데이터 바인딩이 작동합니다.

탭 1에는 DiagnosticsViewModel의 여러 문자열 속성에 액세스해야하는 UserControl이 포함되어 있지만 응용 프로그램을 실행하면 출력 창에 모든 바인딩 실패했습니다. 예를 들어 : UCName는 문자열 DependencyProperty에있다

<Grid> 
    <uc:Tab1UserControl UCName="{Binding Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
</Grid> 

:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Property1; DataItem=null; target element is 'Tab1UserControl' (Name=''); target property is 'UCName' (type 'String')

표 1에서 UserControl을위한 XAML은 다음과 같이 보인다.

Tree를 검색하여 가장 가까운 Window의 DataContext에 바인드하고 My Window의 DataContext를 DiagnosticsViewModel로 설정하고 싶다면 WPF를 사용하여 UserControl의 DataContext에 사용하지 않는 이유는 무엇입니까? 내 UserControl에서 부모로부터 DataContext를 상속받을 수있을 것이라는 기대로 과거에 부적절하게 여러 번했기 때문에 DataContext = this을 내 UserControl에 설정하지 않았습니다.

Snoop이 내 문제를 밝힐 수 있는지보고 싶지만이 GUI가 MFC 응용 프로그램에서 표시되고 Snoop이 내 WPF 대화 상자에 연결할 수없는 것 같습니다.

답변

1

RelativeSource, ElementName 등을 사용하여 바인딩 소스를 변경하면 바인딩은 데이터 컨텍스트가 아닌 지정한 요소에 직접 적용됩니다. 즉, 코드에서 사용자 정의 컨트롤은 Diagnostics 클래스 자체에서 Property1이라는 속성에 바인딩하려고합니다.

시도 사용자 컨트롤의 코드에서

<Grid> 
    <uc:Tab1UserControl UCName="{Binding Path=DataContext.Property1, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
</Grid> 

를 사용하여 그 문제가 해결되는지 확인합니다.

(제쳐두고, 사용자 컨트롤의 요점은 내가 소유하고있는 창에 주어진 속성을 가진 datacontext가 코드 냄새처럼 느껴진다는 것을 사용자 컨트롤 자체가 생각하기 때문입니다. 재사용 가능 - 사용자 정의 컨트롤에 종속성 속성을 사용하고이를 사용할 때 해당 속성에 바인드하는 것이 좋을 것 같습니다. 이것은 단지 컨텍스트가 부족하기 때문에 발생할 수 있습니다.)

+0

감사합니다. 이미 시도했지만 작동하지 않았지만 방금 다시 추가 했으므로 속성 중 하나가 작동하는 것으로 보입니다. 체크 아웃하면 다시 확인하고 답으로 표시합니다! – Dave

+0

마지막 주석에 관한, UserControl *의 UCName은 * DependencyProperty이며 UserControl의 소비자가 초기 속성 값 중 하나를 설정할 수 있도록이 방법을 사용하고 있습니다. 그게 좀 더 수용 가능한 접근법처럼 들리니? – Dave

+0

죄송합니다. 바인딩이 어떤 이유로 탭에서 사용되는 대신 사용자 정의 컨트롤의 정의에있는 것으로 읽습니다. 당신이하고있는 방식은 완벽하게 받아 들일 수있는 접근법이며, 나는 그것을 어떻게 잘못 읽었는지 알지 못합니다! – Astrid

관련 문제