2015-01-22 6 views
0

DependencyProperties가있는 UserControls를 사용하는 동안 DataContext를 설정할 위치를 결정하는 것이 중요하다는 것을 깨달았습니다. 그림을 그리기 위해 샘플 애플리케이션을 만들었습니다. 두 된 UserControls는 DataContext를 설정되는 경우 제외 동일 모두 있습니다DependencyProperties와 관련된 Unsercontrol의 DataContext는 어떻게 작동합니까?

작업의 UserControl :

<UserControl x:Class="DpropTest.OkUserControl" 
     ...> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:OkUserControl }}"> 
     <TextBlock Text="{Binding Path=MyDepProp}"></TextBlock> 
    </Grid> 
</UserControl> 

작동하지 않는 사용자 제어 :

<UserControl x:Class="DpropTest.NotOkUserControl" 
     ... 
     DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:NotOkUserControl}}" 
     > 
<Grid > 
    <TextBlock Text="{Binding Path=MyDepProp}"></TextBlock> 
</Grid> 

두 된 UserControls은 DependencyProperty에이

#region Dependency Property Declaration 
    public static readonly DependencyProperty MyDepPropProperty = DependencyProperty.Register(
     "MyDepProp", typeof(string), typeof(NotOkUserControl), new PropertyMetadata(default(string))); 

    public string MyDepProp 
    { 
     get { return (string)GetValue(MyDepPropProperty); } 
     set { SetValue(MyDepPropProperty, value); } 
    } 
    #endregion Dependency Property Declaration 
라는 MyDepProp 1,515,

이 내가 MainWindow를 행 된 UserControls 통합 방법이다

<Grid x:Name="ParentGrid"> 
    <StackPanel> 
     <dpropTest:OkUserControl MyDepProp="{Binding Path=ActualWidth, ElementName=ParentGrid}"/> 
     <dpropTest:NotOkUserControl MyDepProp="{Binding Path=ActualWidth, ElementName=ParentGrid}"/> 
    </StackPanel> 
</Grid> 

실행중인 응용 프로그램은 제 UserControlonly 대한 actualWith 만, 제 UserControl을는 DP 그다지 결합 등 해제 유지 나타낸다. 두 번째 UserControl에 대한 출력 창에 오류가 없습니다

...

어쩌면 WPF 프로는 간단한 설명과 함께 거기에있다

? 감사합니다. 울리

답변

0
<UserControl x:Class="DpropTest.NotOkUserControl" 
     ... 
     DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=dpropTest:OkUserControl }}" 

는 잘못된 부모에게 구속력이 나에게 보인다! 당신은 NotOkUserControl 내부에 있지만

+0

NotOkUserControl은 여전히 ​​고유 한 ancester가 아닙니다. – Clemens

+0

사실 이것이 내 혼란의 원천입니다. UserControls의 유일한 차이점은 작업중 인 경우 LayoutRoot에 DataContext ist가 설정되어 있다는 것입니다. 여기서 클래스에서 작업하지 않는 경우 –

+0

내가 너에게 쓴 것을 다시 읽어라. 당신은 DataContext가없는 이유 인 잘못된 부모에 바인딩하고 있습니다. NotOkUserControl 헤더의 AncestorType = OKUserControl을 찾는 것은 의미가 없습니다. 바인딩 정의 변경을 고려하십시오. VisualTree에서 상대 바인딩을 정의하는 위치도 중요합니다. –

1

내가하지만 그 외에도, FindAncestor는 요소 자체에 시작됩니다 생각하지 않아요 ... 도달 할 수없는 AncestorType 요청하고 있습니다 :

DataContext="{Binding RelativeSource={RelativeSource Self}}" 
: 당신도 해당 UserControl에서이 작업을 설정할 수 있습니다

또는 InitializeComponent를하기 전에, 사용자 정의 컨트롤의 생성자에서이 설정 : (!) 참고로

DataContext = this; 

: 그건 종종 필요한 몇 가지 조상의 ActualWidth와 바인딩; 이 경우 stackpanel의 너비는 부모 그리드의 너비와 같고 usercontrols의 너비는 th stackpanel의 너비와 같습니다. 따라서 실제로 MyDepProp은 usercontrol의 ActualWidth와 같습니다.

+0

실제로 ActualWith에 관한 것은 아니며, 빠른 샘플을 위해 그 속성을 드래그했습니다. 나는 왜 그것이 분명히 많은 차이가 있는지 알지 못한다. DataContext는 또는 포함 된 FrameworkElement에 선언되어있다. –