将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));
更新: 在这个例子中,我可以使用局部变量,但这个例子只是为了便于说明问题。问题确实发生在构造之后,我访问未初始化的“设置”。
答案 0 :(得分:2)
这是因为数据绑定是在优先级较低的线程上异步执行的。因此,在您绑定绑定之后,您的代码将在绑定实际更新值之前继续执行,因此它仍然是null
。
您可以使用本地reportSettings
值(如您所发现的),或使用Dispatcher.Invoke()
执行后续代码,使用DispatcherPriority
低于DispatcherPriority.DataBind
}。
答案 1 :(得分:0)
我的一位同事帮助了我。这只是绑定中的一个基本错误。这解决了这个问题:
var binding = new Binding() { Source = reportSettings };