PR

【C# WPF】DataGridを階層化アーキテクチャで使う

C#
スポンサーリンク

はじめに

この記事では、DataGridを階層化アーキテクチャで使う方法をテーマにしたいと思います。

以前紹介した「【C# WPF】DataGridの使い方の基礎」を元に、階層化アーキテクチャに変更してみます。

プロジェクトを作成して階層化

まず、プロジェクト「Domain」を追加します。

  • ソリューションエクスプローラで「ソリューション」を選択して、右クリック・メニューから「追加」→「新しいプロジェクト」と進む。
  • 「新しいプロジェクトを追加」というパネルが開くので、右枠の中で C#の「クラス ライブラリ」を選んで「次へ」をクリック。
  • 「新しいプロジェクトを構成します」というパネルが開くので、「プロジェクト名」を「Domain」として、「次へ」をクリック。

次に参照を設定します。

  • ソリューションエクスプローラでプロジェクト「WpfApp1」の「依存関係」を右クリック→「プロジェクト参照の追加」を選びます。
  • 「参照マネージャー」が開くので、「Domain」の左にあるチェックボックスをオンにして「OK」をクリック。

「依存関係」の右下に警告アイコンが出たり、「NU1201:プロジェクト Domain は net7.0-windows7.0 (.NETCoreApp,Version=v7.0) と互換性がありません。」といったエラーが出た場合は、「WpfApp1」を右クリックして「プロパティ」を選ぶ、タブ画面が開くので「ターゲット フレームワーク」をそろえます。今回は「.NET 8.0」です。

しばらくするとエラーが消えるはず。

Modelを編集

Domainプロジェクトにコードを移します。

「MainWindow.xaml.cs」から「Model.cs」へコードを移します。

  • Domainプロジェクトの中にある「Class1.cs」を「Model.cs」に名称変更します。「ソリューション・エクスプローラ」で選択して「F2」を押せばできます。
  • 「Model.cs」を開いて、「ValueObject0」というクラスを定義します。そのクラスの中に、「MainWindow.xaml.cs」から次のコードをカット&ペーストします。
    • 列の項目をプロパティとして定義した、行を表すクラス「DataGrid1Row」
    • 上の行クラスを型にして、定義したコレクション「DataGrid1Rows」
  • 同様に、3つあるボタンのイベントを処理してた部分を、それぞれメソッドとして定義します。名前は「AddRow」「ReplaceRow」「RemoveRow」としましょう。なお、RefreshメソッドとMessageBoxの処理は、移さず「MainWindow.xaml.cs」の方に残します。

以上を行うと「Model.cs」次のようになります。

Model.cs

コレクションの型は、自動で更新通知が発行されるので「ObservableCollection」がオススメ。
(高度な連携をする場合には手動通知が必須になるケースもあります)

ViewModelを追加

データ バインディングで受け渡す際に橋渡しをするクラスを定義します。

「WpfApp1」の中にファイル「ViewModel.cs」を作成しましょう。その中で「ValueObject0」を生成し、生成したオブジェクトを返すプロパティを用意します。

ViewModel.cs

このクラスをプログラム開始時に生成するため「App.xaml.cs」にコンストラクタを追記します。
次のようになります。

App.xaml.cs

画面まわりを編集

MainWindow.xaml に「ItemsSource=」を追加し、「ValueObject0.DataGrid1Rows」をバインディングします。

Item1の方は、元からバインディングされています。このバインディングも必要ですのでこのまま残します。

MainWindow.xaml

MainWindow.xaml.csを編集します。

  • 「DataGrid1.ItemsSource = DataGrid1Rows;」は不要になるので削除。
  • 「DataContext = App.ViewModel;」を追加。
  • ボタンのイベントは、Modelのメソッドを呼ぶように変更。

ModelでMessageBoxを出そうとすると、Windowへの参照が必要になり好ましくないので、今回は「~.xaml.cs」の方で行数を数えて対応することにします。

DataGrid1.Items.Refreshも同様に残します。

MainWindow.xaml.cs

まとめ

今回は、DataGridを階層化アーキテクチャで使う方法をまとめました。
ポイントは次のようになります。

  • データを格納するクラス
    • 列の項目をプロパティとして行のクラスを定義する(列をまとめて行を定義)
    • 行のクラスを型にして、コレクションを定義する(行の集合、つまり行列全体を定義)
    • コレクションの型は、自動で更新通知が発行されるので「ObservableCollection」がオススメ
      (高度な連携をする場合には手動通知が必須になるケースもあります)
  • バインディング
    • DataGridタグのItemsSourceにコレクションをバインディングする。
    • 列の項目に列の項目のプロパティをバインディングする。

コメント

スポンサーリンク
タイトルとURLをコピーしました