【问题标题】:Why is DependencyProperty null after binding?为什么绑定后DependencyProperty为空?
【发布时间】:2012-06-09 10:24:15
【问题描述】:

在我将ReportSettings 绑定到SettingsProperty 之后,我希望能够通过Settings 属性访问ReportSettings。当我尝试这样做时,我得到一个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));

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

【问题讨论】:

    标签: c# wpf binding initialization dependency-properties


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      您可以只使用本地的reportSettings 值(如您所见),或者使用Dispatcher.Invoke() 执行您的后续代码,使用低于DispatcherPriority.DataBindDispatcherPriority

      【讨论】:

      • 如果可以的话,我会投票给你 - 因为你指出并建议了代码中另一个问题的解决方案......
      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 2014-02-26
      • 2011-03-18
      • 1970-01-01
      • 2015-08-28
      • 2016-04-21
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多