銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

WPFのDataGrid:カラムの表示・非表示をバインディングで切り替える

WPFのDataGridで、特定の列の表示・非表示をバインディングで切り替える方法を書いておきます。

f:id:takamints:20160614163925p:plain
photo credit: National Building Museum via photopin (license)

当初、「Visibilityをバインドするんでしょ?」と、簡単にやってみたけど無理でした。 調査の結果「プロキシー(代替)オブジェクトで中継する」と。 「なんのこっちゃ」と思いながらも試行錯誤。どうにか機構を把握して、自力で書けるようになりました。

ここでは、DataGridTextColumnVisibilityCheckBoxIsCheckedへプロキシを介してバインドしていますが、 他のバインディングターゲットにも適用できると思います。

作って覚えるVisual C# 2015 デスクトップアプリ入門
荻原 裕之 宮崎 昭世
秀和システム
売り上げランキング: 24,773
.NET開発テクノロジ入門2016年版Visual Studio 2015対応版
五十嵐 祐貴 生形 可奈子 大田 一希 古賀 慎一 酒井 達明 芝村 達郎 田淵 義人
日経BP
売り上げランキング: 11,454

以下、チェックボックスによって切り替えるコードです。XAMLだけで出来るのですね。

MainWindow.xaml

gist.github.com

XAMLの基礎については、こちら(↓)もご参考に。

takamints.hatenablog.jp

コードの説明

  • 12~13行目: BooleanからVisibilityの値へ変換するコンバーターを宣言しています。チェックボックスのIsCheckedをVisibilityへ変換するためのものです。

  • 15~16行目<FrameworkElement x:Key="ProxyColumnVisibility" DataContext="{Binding Path=IsChecked, ElementName=checkBoxShowColumn}"/>
    GridのResource内に、DataContextをCheckBoxのIsCheckedへバインドしたFrameworkElementを宣言。

  • 20~21行目<ContentControl Visibility="Collapsed" Content="{StaticResource ProxyColumnVisibility}"/>
    非表示にしたContentControlのContentに上で定義しているProxyColumnVisibilityを入れています。

  • 22~24行目<CheckBox x:Name="checkBoxShowColumn"
    FrameworkElementからバインドされるチェックボックスです。

  • 32行目Visibility="{Binding DataContext, Source={StaticResource ProxyColumnVisibility},Converter={StaticResource BooleanToVisibilityConverter}}"
    Visibilityを、ProxyColumnVisibilityのDataContextへバインド。

参考にさせていただいたURL

以下のサイトにお世話になりました。ありがたい。

いくつになってもお勉強

WPFXAMLも年に一度、数か月程しか使わないので、毎年「ややこしいわーわけわからんわー」から始まって、同じところでつまづいて、調べなおして「へぇー」とか言って、そのうち「うわ、これ便利やん」にたどり着く感じ。

系統立てた知識がないのが問題かなと。これを機会に明快な理解を試みようと思っています。

いくつになってもお勉強です。

関連情報(MSDNへのリンク)

「FrameworkElementって何者なの?」「てかResourceってなに?」「ContentControlは必要?」とか、フツフツと沸いてくる疑問に、うまく答えられないワタシがいる。なので、以下にMSDNWPF関連のリンクを並べておきます。そのうち自分で調べる用です。

WPF・MVVM関連記事はこちら:

takamints.hatenablog.jp

takamints.hatenablog.jp

takamints.hatenablog.jp