Q110. XamDataGrid でユーザーが設定したレイアウトを保存したい(其の弐)

A.以前、XamDataGrid でユーザーが操作した列の移動や並び替え、グループ化やソートを次回起動時用に保存したい場合、XamDataGrid.SaveCustomizations メソッドやXamDataGrid.LoadCustomizations メソッドを使えば、レイアウトの保存・読み込みが可能だという記事を公開しました。

関連記事:Q110. XamDataGrid でユーザーが設定したレイアウトを保存したい


しかしこれ、ひとつ問題がありまして、記事の最後に書きましたが

なお上記一連のメソッドの問題点ですが、FieldLayoutSettings で HeaderPrefixAreaDisplayMode プロパティを FieldChooserButton に設定しフィールドの表示項目を選択できるようにした場合、フィールドの表示/非表示の設定を保存したり、非表示にしたフィールドを ClearCustomizations メソッドで復帰することはできません。現状、表示状態の保存は独自に実装するしかないので、この辺りもう少し何とかして欲しいところです。
また、ClearCustomizations メソッドで FieldPosition を初期化すると、FixedLocation=FixedToNearEdge にしたフィールドが FixedLocation=None になってしまうのも問題です。

という悩ましい問題が存在します。


これ、いったいどういう処理を行ってるのか、幸い Infragistics WPFソースコードが公開されてる*1ので読んでみました。DataPresenterBase.ClearCustomizations → CustomizationsManager.ClearCustomizations → FieldLayout.ClearCustomizations と遡ってコードを追ってくと、大元の FieldLayout.ClearCustomizations で Visiblity プロパティを初期化してないため、どうにもならんという結論がでました。*2
だめだこりゃ\(^o^)/*3

FieldChooser 対応版

そこで私は考えた。画面初期化時にField の情報をメンバ変数に保持し、いったん LoadCustomizations で読み込んでから ClearCustomizations メソッドを実行すればいいのではと・・・で、以下サンプルです。


まずビュー。


お次はコードビハインドです。Reset_Click メソッドに注目してください。


LoadCustomizations で十分では?と思う向きもおられるかもしれません。しかし列の移動や段組が初期化されないため、まず全プロパティを初期化した後、表示と列固定を初期状態に戻します。これで前回の宿題は解決しましたが、これに気づくまで3年かかりましたw



WPF FAQ の目次に戻る

*1:ライセンス購入すればインフラさんのサイトからダウンロードできます

*2:カスタマイズしてもいいが、めんどくさすぎる

*3:列の仮想化という問題もあり、実装がややこし過ぎたのかもしれんが