Tag: WPF/DataGrid/DataGridColumn

目次

参考情報

DataGridColumn(一般的な話題)

MVVMで列の表示・非表示を切り替えたい

  • DataGridColumnはVisualTreeに現れないので、RelativeSourceなどで親のDataContextを参照できないらしい。
  • 列の表示非表示情報は、普通、DataGridのItemsSourceにバインドされている行オブジェクトではなく、その親のオブジェクトが持っているべきなのでこれは困る。
  • c# - Bind datagrid column visibility MVVM - Stack OverflowにあるようにダミーのFrameworkElementを定義し参照する方法を使えば回避できる。
    <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} }"
                       Binding="{Binding Text}"/>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel> 
    
    
  • ポイントは親のElementのResourcesに、ダミーのFrameworkElementを定義。ContentControlのContentにダミーエレメントを設定(非表示にしておく)。DataGridTextColumnのVisibilityからStaticResourceとして参照するところ。

DataGridComboBoxColumn

基本

編集可能にする

共通のItemsSourceを使う

値が表示されたり消えたり妙な動作

DataGridComboBoxでElementStyleやEditingElementStyleを指定し、かつIsSynchronizedWithCurrentItem=Trueを使うと同列の他の行の表示がみだれるのでやめたほうがよいっぽい。

                <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

ユーザーコントロールを表示する


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:45