Tag: WPF DataGrid

目次

参考情報

編集コマンド

キーボードによる編集

編集コマンドのハンドリング方法

参考リンク

基本

PreviewKeyDownイベントハンドラを使う。

Deleteキーがおされた時にデフォルトのイベントハンドラが呼ばれる前に自前の処理を行う。

xaml

        <DataGrid PreviewKeyDown="dataGrid_PreviewKeyDown">
        </DataGrid>

コードビハインド

        private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                var dataGrid = (DataGrid)sender;
                MessageBox.Show("DELETEキーが押されました");
                e.Handled = true; //trueを設定するとデフォルト動作は行われない。
            }
        }

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

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

Validation

値入力ごとの検証

DataGridColumnので設定する。以下の例ではValidatesOnDataErrorsがTrueなのでIDataErrorInfoを使って検証される。

<DataGridTextColumn Width="100" Header="名前" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>

行全体の検証

RowValidationRulesにValidationRuleを設定する。

<DataGrid.RowValidationRules>
   <local:RowDataInfoValidationRule ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>

ValidationTemplate

その他

Tips

DataGridRow、DataGridCellを検索する

列を動的に生成する

トラブルシューティング

追加情報: 'DeferRefresh'は、AddNewトランザクションまたはEditItemトランザクションの実行中は許可されません。

再現方法

cell.png
error.png

解決方法


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS