2008-11-17 7 views
14

컨트롤의 XAML이 정상 (데이터 컨텍스트가 xaml로 전파 됨)과 같이 부모의 데이터 컨텍스트에서 적절한 속성에 바인딩 할 수있는 사용자 정의 컨트롤이 있습니다.WPF 사용자 정의 컨트롤의 DataContext가 null입니다.

예를 들어 DataContext를 ObjectA로 설정하고있는 창이 있습니다. 창 내 사용자 정의 컨트롤을 다음 데이터 속성 내에서 속성에 액세스하려고합니다.

그래서 내 창 xaml 및 코드 뒤에 null이 아닌 DataContext 볼 수 있습니다.

DataContext가 전파하는 내 컨트롤은 Xaml의 null이 아닌 DataContext는 볼 수 있지만 코드 숨김은 볼 수 없습니다.

이 문제를 해결하는 적절한 방법은 무엇입니까?

답변

19

실패 당신은 DataContext를 당신의 DataContext가 다른 값으로 null이 변경 될 때까지 늘 UserControl1_DataContextChanged를 입력 DataContextChanged

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged); 
    } 

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     // You can also validate the data going into the DataContext using the event args 
    } 
} 

주를 사용할 수있는 설정되고 있는지 여부를 확인해야합니다.

이 질문에 대한 답변이 확실하지 않지만 디버깅 문제에 사용하기가 매우 쉽습니다.

+1

DataContext를 처음 설정할 때 이벤트를 처리 할 수 ​​있도록 InitializeComponent 전에 DataContextChanged 이벤트를 구독해야했습니다. – Darlene

+0

도 작동합니다. DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

나는 당신이 UserControl의 생성자에서 'DataContext'를 확인하고 있다고 생각합니다. 실행이 생성자 코드에있는 동안 사용자 정의 컨트롤이 아직 생성되지 않았으므로 생성자에서 null이됩니다. 그러나로드 된 이벤트에서 속성을 확인하면 개체가 올바르게 표시됩니다.

public partial class UserControl1 
{ 
    public UserControl1() 
    { 
     this.InitializeComponent(); 

     //DataContext will be null here 
     this.Loaded += new RoutedEventHandler(UserControl1_Loaded); 
    } 

    void UserControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Check DataContext Property here - Value is not null 
    } 
} 
+0

noope. 나는 수업의 맥락에서 그것을 점검하고있다. –

+0

이 답변 이후로 변경된 사항이 있는지는 확실하지 않지만로드 된 이벤트의 컨텍스트는 NULL입니다. – Pakk

+0

내 프로그램 (.NET Framework 4.6.2)에서 InitializeComponent 실행 후 DataContext가 실제로 초기화됩니다. – blearyeye

10

런타임시 바인딩 오류가 있는지 확인합니다. 이 네임 스페이스를 XAML에 추가하십시오.

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System" 

자세한 내용은 디버거의 출력 창을 확인하십시오.

다른 방법으로 더 많은 코드를 표시 할 수 있습니까?

+1

고마워요 ... 이것은 달콤합니다 ... 나는이 주 전에 찾았 으면 좋겠다. –

+0

감사합니다, 고맙습니다, 감사합니다 .... 오늘 == 저장된 –

+0

다행이되어 기뻤습니다. 그리고 upvote 주셔서 감사합니다. – hughdbrown

관련 문제