WPFが時々怒り狂うことがあります。WPFウィンドウとそのユーザーコントロール間でデータを共有する最適な方法は何ですか?
私は、タブコントロールといくつかのタブを含む単一のメインウィンドウで構成されているかなり単純なアプリケーションを持っています。私は、同じファイル内のすべてのタブのコードを持っているという考えが好きではなかったので、this questionの答えを使用して、各タブを別々のユーザーコントロールに分割しました。
私のメインウィンドウの中に、私はアプリケーション設定と他のアプリケーション全体のデータを含むオブジェクトのインスタンスを持っています。いくつかのタブでは、データバインディングの目的でこのデータにアクセスする必要があります。私はこれを達成する良い方法を見つけることができませんでした。
最初に、コントロールのLoadedイベントで親ウィンドウにアクセスしようとしましたが、以下のコードに示すように、設定オブジェクトを公開したメインウィンドウのプロパティへの参照を取得しました。この種の作業は、タブがフォーカスを獲得するたびにロードされたイベントを起動します。また、このイベントはコントロールのライフサイクルの後半に発生するため、ユーザーコントロールのXAMLでこのオブジェクトのプロパティのいずれにもバインドできません。
private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings;
}
次に、データをユーザーコントロールのコンストラクタに渡すことを実験しましたが、XAMLでこれを行う方法はありません。
これらがアプリケーション全体の設定であることを考えれば、私はApplicationSettingsクラスをシングルトンにしてどこでも参照することができますが、単体テストの目的ではしません。
このように何を達成するのですか?私のアプローチは根本的に欠陥がありますか?私の考えでは、これらのUI要素はすべて同じウィンドウの一部であるため、メインウィンドウからデータにアクセスできるはずですが、オブジェクトモデルはこれを許可しないように見えます。
これは私が取るつもりのルートだと思います。私が元の投稿で言ったように、私は実際のシングルトンなしでシングルトンの動作をしたい、そして、これは私にそれを与える。実際には、おそらくクラスをシングルトンにしますが、テスト目的でコンストラクタを公開しておきます。 ありがとう! – EricTheRed