1

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

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

4

2 回答 2

2

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

您可以只使用本地reportSettings值(如您发现的那样),也可以Dispatcher.Invoke()使用DispatcherPriority低于DispatcherPriority.DataBind.

于 2012-06-05T12:16:12.003 回答
0

我的一个同事帮了我。这只是装订中的一个基本错误。这解决了这个问题:

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

于 2012-06-06T19:00:14.793 回答