WPF アプリケーションでのデータの持ち方を紹介します。
MVVM の利用有無にかかわらず、アプリケーションのデータをどこでもつか悩みどころです。WPFはフレームワークによるコードの隠蔽化が WinForm より顕著なため、どこからプログラムがスタートするさえ分かりにくいです。正直、とっつきにくいです。
データの持ち方
アプリケーションでデータを管理するときに使用するのが、ひっそりと追加されている App.xaml.cs です。
App.xaml.cs は App.xaml の影に隠れていますが、アプリケーションにとって最も大切なソースです。
App.Xaml.cs は Application クラスから派生しており、このクラスこそがプログラム開始時に唯一生成されるインスタンスです。 インスタンスには Current プロパティで取得できます。
データは、App クラス内に配置しておきます。MVVMパターンであれば、Model クラスの実体を App クラス内で持つとよいです。これにより、複数のViewModel 内から共通のModel にアクセスが可能になります。
サンプル
Application.Current では、Appクラスのメンバーは見えないため、Appクラスにキャストしたメンバーで上書きしておきます。
namespace WpfAppTest { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { public static new App Current => (App)Application.Current; // アプリケーション全体で共有するデータはここで宣言 // フィールドにするかプロパティにするかは考慮して public int x = 10; } }
プロジェクト内の任意のクラスからの呼び出し例
namespace WpfAppTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 呼び出し例 int x = App.Current.x; } } }
呼び出し側は App.Current がグローバル変数のイメージでアクセスできるようになるのがポイントです。