How add a global "IsReadOnly" style to all DataGridTextColumns

619 views Asked by At

I currently have a ResourceDictionary file for my WPF application, which pretty much adds every style that I could possibly want throughout all of my application's DataGrids.

Except one.

How can I add a global "IsReadOnly" setter, for all of my DataGrid's DataGridTextColumn columns ?

Basically, I use a few DataGrids, and if I want to display read-only data in a particular column, I'll just display the data using a DataGridTextColumn:

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

However, if I have a column which has editable data, then I'll use a DataGridTemplateColumn instead.

<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>

The problem is, for every one of my DataGridTextColumns, I specifically need to add the IsReadOnly parameter, otherwise the user can (incorrectly) edit that data:

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

Is there a way to add this "IsReadOnly" setting globally, in the ResourceDictionary file, to all of my DataGridTextColumns...?

I can add global styles to DataGrid, DataGridColumnHeader, DataGridRow, and DataGridCell, but if I try to define a style with a TargetType of DataGridTextColumn, then Visual Studio complains that DataGridTextColumn is not derived from a FrameworkElement or FrameworkContentElement.

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

I can add IsReadOnly to the Grid style, but this makes all columns uneditable !

Can anyone think of an quick and easy way to add this simple property to the DataGridTextColumns ?

Update:

My solution has been (reluctantly) to add a Loaded handler to each of my DataGrids, which runs this code:

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. 
        }
    }
}

You could, of course, put this in your own DataGrid-inherited control, rather than repeating it for each of your DataGrids.

(Sigh.) Why didn't MS make IsReadOnly an attachable property..? It would've made life so much easier!

0

There are 0 answers