&tag(WPF/DataGrid/DataGridColumn);
*目次 [#t0a80104]
#contents
*参考情報 [#v834cf42]
-[[WPF]]
-[[WPF/DataGrid]]

*DataGridColumn(一般的な話題) [#oa89cf39]
**MVVMで列の表示・非表示を切り替えたい [#of5b0456]
-DataGridColumnはVisualTreeに現れないので、RelativeSourceなどで親のDataContextを参照できないらしい。
-列の表示非表示情報は、普通、DataGridのItemsSourceにバインドされている行オブジェクトではなく、その親のオブジェクトが持っているべきなのでこれは困る。
-[[c# - Bind datagrid column visibility MVVM - Stack Overflow:http://stackoverflow.com/questions/7711275/bind-datagrid-column-visibility-mvvm]]にあるようにダミーのFrameworkElementを定義し参照する方法を使えば回避できる。
#pre{{

<StackPanel>
    <StackPanel.Resources>
       <local:BooleanToVisibilityConverter
              x:Key="BooleanToVisibilityConverter" />

       <FrameworkElement x:Key="ProxyElement"
                         DataContext="{Binding}"/>
    </StackPanel.Resources>
    <ContentControl Visibility="Collapsed"
                Content="{StaticResource ProxyElement}"/>
    <DataGrid AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn
                   Visibility="{Binding DataContext.IsTextColumnVisibile,
                                        Source={StaticResource ProxyElement},
                                        Converter={StaticResource
                                            BooleanToVisibilityConverter}}"
                                            BooleanToVisibilityConverter} }"
                   Binding="{Binding Text}"/>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel> 

}}
-ポイントは親のElementのResourcesに、ダミーのFrameworkElementを定義。ContentControlのContentにダミーエレメントを設定(非表示にしておく)。DataGridTextColumnのVisibilityからStaticResourceとして参照するところ。

*DataGridComboBoxColumn [#s17505ee]
**基本 [#ndd44f7c]
-[[WPF DataGrid &#8211; Dynamically updating DataGridComboBoxColumn - Vincent Sibal's Blog - Site Home - MSDN Blogs:http://blogs.msdn.com/b/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx]]によると、DataBindingを使っている場合普通に表示するだけでも結構めんどくさい。ElementStyleやEditingElementStyleを定義しないと表示できない?

**編集可能にする [#l4fbc04e]
-[[combobox - using wpf datagridcomboboxcolumn's IsSynchronizedWithCurrentItem - Stack Overflow:http://stackoverflow.com/questions/4700346/using-wpf-datagridcomboboxcolumns-issynchronizedwithcurrentitem]]では結局DataGridTemplateColumnを使っている。DataGridComboBoxColumnでは不可能なのかも。

**共通のItemsSourceを使う [#z5263074]
-各行に選択肢リストをもたせるのではなく、共通の選択肢リストをもたせたい。
-[[Using WPF DataGridComboBoxColumn with MVVM - Binding to Property in ViewModel - Stack Overflow:http://stackoverflow.com/questions/3562934/using-wpf-datagridcomboboxcolumn-with-mvvm-binding-to-property-in-viewmodel]]ではRelativeSourceを使っておやのDataContextを探す方法で実現している。

**値が表示されたり消えたり妙な動作 [#i3691ad8]
DataGridComboBoxでElementStyleやEditingElementStyleを指定し、かつIsSynchronizedWithCurrentItem=Trueを使うと同列の他の行の表示がみだれるのでやめたほうがよいっぽい。
#pre{{
                <DataGridComboBoxColumn Width="*" Header="変数の型">
                    <DataGridComboBoxColumn.ElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Path=Types}"/>
                            <!-- これ -->
                            <Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
                            <Setter Property="DisplayMemberPath" Value="Label"/>
                            <Setter Property="IsReadOnly" Value="True"/>
                            <Setter Property="SelectedItem" Value="{Binding Type}"/>
                        </Style>
                    </DataGridComboBoxColumn.ElementStyle>
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Path=Types}"/>
                            <!-- これ -->
                            <Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
                            <Setter Property="DisplayMemberPath" Value="Label"/>
                            <Setter Property="SelectedItem" Value="{Binding Type}"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
}}
*DataGridTemplateColumn [#qc97e048]
**ユーザーコントロールを表示する [#b1206246]
-[[wpf - custom control in DataGridTemplateColumn - Stack Overflow:http://stackoverflow.com/questions/4536987/custom-control-in-datagridtemplatecolumn]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS