WPFのDataGrid:カラムの表示・非表示をバインディングで切り替える
WPFのDataGridで、特定の列の表示・非表示をバインディングで切り替える方法を書いておきます。
photo credit: National Building Museum via photopin (license)
当初、「Visibilityをバインドするんでしょ?」と、簡単にやってみたけど無理でした。 調査の結果「プロキシー(代替)オブジェクトで中継する」と。 「なんのこっちゃ」と思いながらも試行錯誤。どうにか機構を把握して、自力で書けるようになりました。
ここでは、DataGridTextColumn
のVisibility
をCheckBox
のIsChecked
へプロキシを介してバインドしていますが、
他のバインディングターゲットにも適用できると思います。
以下、チェックボックスによって切り替えるコードです。XAMLだけで出来るのですね。
MainWindow.xaml
コードの説明
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
以下のサイトにお世話になりました。ありがたい。
- [WPF]DataGridColumnへのバインディング | OITA: Oika's Information Technological Activities
- c# - Bind datagrid column visibility MVVM - Stack Overflow
いくつになってもお勉強
WPFもXAMLも年に一度、数か月程しか使わないので、毎年「ややこしいわーわけわからんわー」から始まって、同じところでつまづいて、調べなおして「へぇー」とか言って、そのうち「うわ、これ便利やん」にたどり着く感じ。
系統立てた知識がないのが問題かなと。これを機会に明快な理解を試みようと思っています。
いくつになってもお勉強です。
関連情報(MSDNへのリンク)
「FrameworkElementって何者なの?」「てかResourceってなに?」「ContentControlは必要?」とか、フツフツと沸いてくる疑問に、うまく答えられないワタシがいる。なので、以下にMSDNのWPF関連のリンクを並べておきます。そのうち自分で調べる用です。