Как добавить глобальный стиль "IsReadOnly" для всех DataGridTextColumns - PullRequest
1 голос
/ 09 февраля 2011

В настоящее время у меня есть файл ResourceDictionary для моего приложения WPF, который в значительной степени добавляет каждый стиль, который я мог бы хотеть во всех DataGrids моего приложения.

За исключением одного.

Как добавить глобальный установщик " IsReadOnly " для всех DataGridTextColumn столбцов моей DataGrid?

Обычно я использую несколько DataGrids, и если я хочу отображать данные только для чтения в определенном столбце, я просто отображаю данные, используя 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 ...?

I может добавлять глобальные стили в DataGrid, DataGridColumnHeader, DataGridRow и DataGridCell, но если я пытаюсь определить стиль с TargetType DataGridTextColumn, тогда Visual Studio жалуется, что DataGridTextColumn не является производным от FrameworkE или FrameworkContentElement.

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

I может добавить IsReadOnly к стилю сетки, но это делает все столбцы недоступными для редактирования!

Кто-нибудь может придумать, как быстро и просто добавить это простое свойство в DataGridTextColumns?

Обновление:

Мое решение было (неохотно) добавить обработчик Loaded к каждой из моих DataGrids, который выполняет этот код:

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, вместо того, чтобы повторять его для каждой из ваших DataGrids.

(Вздох.) Почему MS не делает IsReadOnly присоединяемым свойством ..? Это сделало бы жизнь намного проще!

...