2012-06-13 1 views
5

데이터 컨텍스트 기본값 :MainWindow.xaml에 아래의 XAML을 갖는

<Window x:Class="TestDependency.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <Label Name="someLabel" Grid.Row="0" Content="{Binding Path=LabelText}"></Label> 
    <Button Grid.Row="2" Click="Button_Click">Change</Button> 
    </Grid> 
</Window> 

그리고 MainWindow.xaml.cs를 뒤에 다음 코드를

public static readonly DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText", typeof(String), typeof(MainWindow)); 

public int counter = 0; 

public String LabelText 
{ 
    get 
    { 
    return (String)GetValue(LabelTextProperty); 
    } 

    set 
    { 
    SetValue(LabelTextProperty, value); 
    } 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    LabelText = "Counter " + counter++; 
} 

내가 생각했을 그 기본 DataContext 뒤에있는 코드입니다. 하지만 나는 DataContext을 지정해야합니다. 어느 쪽이 기본값 인 DataContext입니까?Null? 나는 뒤에있는 코드가 (같은 클래스 인 것처럼)있을 것이라고 생각했을 것이다.

그리고이 샘플로 내가 레이블의 내용을 수정할 뒤에 코드를 사용하고

, 내가 직접 사용할 수 있습니다

이 는
someLabel.Content = "Counter " + counter++; 
가 내가 기대

코드 뒤에있는 것은, 그것은이 안된다고 DataContext이 다른 클래스에있는 경우 가지고있는 UI 업데이트 문제

답변

5

예, DataContext의 기본값은 여기 null이다가 FrameworkElement 클래스에 선언 어떻게입니다 -

public static readonly DependencyProperty DataContextProperty = 
    DependencyProperty.Register("DataContext", typeof(object), 
    FrameworkElement._typeofThis, 
    (PropertyMetadata) new FrameworkPropertyMetadata((object)null, 
     FrameworkPropertyMetadataOptions.Inherits, 
     new PropertyChangedCallback(FrameworkElement.OnDataContextChanged))); 

FrameworkPropertyMetadata 속성의 기본 가치에 대한 첫 PARAM 걸립니다.

모든 자식 컨트롤에 의해 상속되기 때문에 창 데이터 컨텍스트를 지정하지 않으면 lable의 DataContextnull으로 유지됩니다.

코드 숨김에 someLabel.Content = "Counter " + counter++;을 사용하면 라벨 내용을 설정할 수 있습니다. 따라서 코드에서 컨트롤에 액세스하는 것이 완벽하게 가능합니다.

3

Label의 속성을 바인딩하기 때문에 다른 바인딩 소스를 어떻게 든 지정하지 않으면 바인딩 엔진은 LabelText이 해당 클래스의 속성이라고 가정합니다. LabelMainWindow의 자손이므로 바인딩 소스는 해당 윈도우 여야하므로 마술처럼 결정할 수 없습니다. 따라서 명시 적으로 선언해야합니다.

은 "데이터 컨텍스트"와 "바인딩 소스"의 개념은 별개의 참고하는 것이 중요합니다 : DataContext한 바인딩 소스를 지정하는 방법하지만 there arealsoothers입니다.

+0

그러나 바인딩/datacontext는 지정되지 않은 경우 부모로부터 상속됩니다. 그렇지 않으면 창 클래스에서 datacontext를 설정해도 여전히 결과가 생성되지 않습니다. –

+0

@MiyamotoAkira : 물론, 상속되었습니다 ('DataContext'에 대한 문서에서도 마찬가지입니다). 그런데 왜 당신의'MainWindow'가 디폴트로'DataContext'가 될 것으로 기대합니까? 바인딩 엔진은 마음을 읽을 수 없습니다. – Jon

+1

이 프로그램의 계층 구조의 최상위로'MainWindow'를보고 있기 때문에 나는 가정합니다. 그러나 wpf가 두포 (아직 :-)에서 무엇을하고 있는지 알지 못하며 그 위에 다른 것들이있을 것입니다. –