绑定后为什么DependencyProperty为null?

时间:2012-06-05 11:41:47

标签: c# wpf binding initialization dependency-properties

ReportSettings绑定到SettingsProperty后,我希望能够通过ReportSettings属性访问Settings。当我尝试这样做时,我得到NullReferenceException。 任何人都可以帮助我吗?

ReportSettings是一个实现INotifyPropertyChanged的类。

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));

更新: 在这个例子中,我可以使用局部变量,但这个例子只是为了便于说明问题。问题确实发生在构造之后,我访问未初始化的“设置”。

2 个答案:

答案 0 :(得分:2)

这是因为数据绑定是在优先级较低的线程上异步执行的。因此,在您绑定绑定之后,您的代码将在绑定实际更新值之前继续执行,因此它仍然是null

您可以使用本地reportSettings值(如您所发现的),或使用Dispatcher.Invoke()执行后续代码,使用DispatcherPriority低于DispatcherPriority.DataBind }。

答案 1 :(得分:0)

我的一位同事帮助了我。这只是绑定中的一个基本错误。这解决了这个问题:

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