如何添加一个全球性的“IsReadOnly””样式到所有DataGridTextColumns

我目前有一个用于我的WPF应用程序的ResourceDictionary文件,它几乎在我的所有应用程序的DataGrids中添加了我可能想要的每种样式。 除了一个。 如何为我的所有DataGrid的DataGridTextColumn列添加全局“IsReadOnly”setter? 基本上,我使用了一些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" />
有没有办法在ResourceDictionary文件中全局添加这个“IsReadOnly”设置到我的所有DataGridTextColumns ......? 我可以向DataGrid,DataGridColumnHeader,DataGridRow和DataGridCell添加全局样式,但是如果我尝试定义TargetType为DataGridTextColumn的样式,则Visual Studio会抱怨DataGridTextColumn不是从FrameworkElement或FrameworkContentElement派生的。
<Style TargetType="{x:Type WPFToolkit:DataGridTextColumn}">
    <Setter Property="IsReadOnly" Value="True"/>
</Style>
我可以将IsReadOnly添加到网格样式,但这使得所有列都不可编辑! 有人能想到一种快速简便的方法将这个简单的属性添加到DataGridTextColumns吗? 更新: 我的解决方案(不情愿地)为我的每个DataGrids添加一个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继承控件中,而不是为每个DataGrids重复它。 (叹。) 为什么MS没有让IsReadOnly成为一个可附加的财产..?它会让生活变得如此简单!     
已邀请:

要回复问题请先登录注册