1

バインドReportSettingsした後、プロパティを介してSettingsPropertyアクセスできるようになると思います。そうしようとすると、が表示されます。誰かがここで私を助けることができますか?ReportSettingsSettingsNullReferenceException

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()てフォローアップ コードを実行することができます。DispatcherPriorityDispatcherPriority.DataBind

于 2012-06-05T12:16:12.003 に答える