1

現在、WPFアプリケーション用のResourceDictionaryファイルがあります。これにより、アプリケーションのすべてのDataGrid全体で必要になる可能性のあるすべてのスタイルがほぼ追加されます。

1つを除いて。

DataGridのすべてのDataGridTextColumn列にグローバルな「 IsReadOnly 」セッターを追加するにはどうすればよいですか?

基本的に、私はいくつかのDataGridを使用します。特定の列に読み取り専用データを表示する場合は、DataGridTextColumnを使用してデータを表示します。

<WPFtoolkit:DataGridTextColumn Binding="{Binding Path=DOB,StringFormat='dd/MMM/yyyy'}" Header="DOB" Width="120" />

ただし、編集可能なデータを含む列がある場合は、代わりにDataGridTemplateColumnを使用します。

<WPFtoolkit:DataGridTemplateColumn xHeader="Department Name"  >
    <WPFtoolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Width="175"
               ItemsSource="{Binding Source={StaticResource AllDepartmentsDataSource}}"
               SelectedValue="{Binding DepartmentID}" SelectedValuePath="DepartmentID" DisplayMemberPath="DepartmentName"
               VerticalAlignment="Center" 
               >
            </ComboBox>
        </DataTemplate>
    </WPFtoolkit::DataGridTemplateColumn.CellTemplate>
</tWPFtoolkit:DataGridTemplateColumn>

問題は、DataGridTextColumnsのすべてについて、特にIsReadOnlyパラメーターを追加する必要があることです。そうしないと、ユーザーはそのデータを(誤って)編集できます。

<WPFtoolkit:DataGridTextColumn IsReadOnly="True" Binding="{Binding Path=DOB,StringFormat='dd/MMM/yyyy'}" Header="DOB" Width="120" />

この「IsReadOnly」設定を、ResourceDictionaryファイルですべてのDataGridTextColumnsにグローバルに追加する方法はありますか...?

グローバルスタイルをDataGrid、DataGridColumnHeader、DataGridRow、およびDataGridCellに追加できますが、TargetTypeがDataGridTextColumnでスタイルを定義しようとすると、VisualStudioはDataGridTextColumnがFrameworkElementまたはFrameworkContentElementから派生していないと文句を言います。

<Style TargetType="{x:Type WPFToolkit:DataGridTextColumn}">
    <Setter Property="IsReadOnly" Value="True"/>
</Style>

グリッドスタイルにIsReadOnlyを追加できますが、これによりすべての列が編集できなくなります

この単純なプロパティをDataGridTextColumnsに追加するためのすばやく簡単な方法を誰かが考えられますか?

アップデート:

私の解決策は、(しぶしぶ)次のコードを実行する各DataGridにLoadedハンドラーを追加することでした。

void grdGrid_Loaded(object sender, RoutedEventArgs e)
{
    DataGrid dg = (DataGrid)sender;
    foreach (DataGridColumn col in dg.Columns)
    {
        DataGridTextColumn textCol = col as DataGridTextColumn;
        if (textCol != null)
        {
            textCol.IsReadOnly = true;
        }
        else
        {
            //  This DataGridColumn isn't of type "DataGridTextColumn", so do nothing. 
        }
    }
}

もちろん、これをDataGridごとに繰り返すのではなく、独自のDataGrid継承コントロールに配置することもできます。

(ため息。)MSがIsReadOnlyをアタッチ可能なプロパティにしないのはなぜですか。それは人生をとても楽にしていたでしょう!

4

0 に答える 0