2012-06-05 2 views
1

ReportSettingsSettingsProperty에 바인딩하면 ReportSettingsSettings 속성을 통해 액세스 할 수 있습니다. 그렇게하려고하면 NullReferenceException이 나옵니다. 누구나 나를 도울 수 있습니까?바인딩 후 DependencyProperty가 null 인 이유는 무엇입니까?

ReportSettingsINotifyPropertyChanged을 구현하는 클래스입니다.

public MyWindow() { 
    InitializeComponent(); 
    // Load default template 
    string defaultTemplateName = "default"; 
    foreach (var reportSettings in SettingsCache.Instance.AllReportSettings) { 
     if (reportSettings.TemplateName.Equals(defaultTemplateName, StringComparison.CurrentCultureIgnoreCase)) { 
      var binding = new Binding("SettingsProperty") { Source = reportSettings }; 
      SetBinding(SettingsProperty, binding); 
      var testDirect = reportSettings.IsVisible; // OK 
      var testDepProp = Settings.IsVisible; // NullReferenceException!!! 
      //... 
     } 
    } 
} 

public ReportSettings Settings { 
    get { return (ReportSettings)GetValue(SettingsProperty); } 
    set { SetValue(SettingsProperty, value); } 
} 

public static readonly DependencyProperty SettingsProperty = DependencyProperty.Register(
     "Settings", typeof(ReportSettings), typeof(MyWindow), 
     new PropertyMetadata(null, OnSettingsChanged)); 

업데이트 : 이 예에서는 그냥 로컬 변수를 사용할 수 있지만 예를 들어 그냥 문제의 쉬운 그림입니다. 문제는 실제로 건설 이후에 발생합니다. 여기서 초기화되지 않은 '설정'에 액세스합니다.

답변

0

동료가 나를 도왔습니다. 그것은 단순히 바인딩의 기본적인 오류였습니다. 난 그냥이 시도, 그것은 도움이되지 않았다 -

var binding = new Binding() { Source = reportSettings };

1

데이터 바인딩이 낮은 우선 순위 스레드에서 비동기 적으로 실행되기 때문입니다. 따라서 바인딩을 연결 한 후에는 바인딩이 실제로 값을 업데이트하기 전에 코드가 계속 실행되므로 여전히 null이됩니다.

당신도 단지 DispatcherPriority 낮은 DispatcherPriority.DataBind보다를 사용하여 후속 코드를 실행할 수 (당신이 발견으로) 로컬 reportSettings 값을 사용하거나 Dispatcher.Invoke()를 사용할 수 있습니다.

+0

좋은 제안이이 문제를 해결했습니다. – mola

+0

코드에서 다른 문제에 대한 해결책을 제시하고 제안했기 때문에 제가 할 수만 있다면 투표 할 수 있었을 것입니다 ... – mola

관련 문제