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 프로는 간단한 설명과 함께 거기에있다
? 감사합니다. 울리
NotOkUserControl은 여전히 고유 한 ancester가 아닙니다. – Clemens
사실 이것이 내 혼란의 원천입니다. UserControls의 유일한 차이점은 작업중 인 경우 LayoutRoot에 DataContext ist가 설정되어 있다는 것입니다. 여기서 클래스에서 작업하지 않는 경우 –
내가 너에게 쓴 것을 다시 읽어라. 당신은 DataContext가없는 이유 인 잘못된 부모에 바인딩하고 있습니다. NotOkUserControl 헤더의 AncestorType = OKUserControl을 찾는 것은 의미가 없습니다. 바인딩 정의 변경을 고려하십시오. VisualTree에서 상대 바인딩을 정의하는 위치도 중요합니다. –