1

我目前有一个用于我的 WPF 应用程序的 ResourceDictionary 文件,它几乎在我的所有应用程序的 DataGrids 中添加了我可能想要的每一种样式。

除了一个。

如何为我的所有 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" />

有没有办法在 ResourceDictionary 文件中将这个“IsReadOnly”设置全局添加到我的所有 DataGridTextColumns...?

可以将全局样式添加到 DataGrid、DataGridColumnHeader、DataGridRow 和 DataGridCell,但如果我尝试使用 DataGridTextColumn 的 TargetType 定义样式,那么 Visual Studio 会抱怨 DataGridTextColumn 不是从 FrameworkElement 或 FrameworkContentElement 派生的。

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

可以将 IsReadOnly 添加到 Grid 样式中,但这会使所有列都无法编辑!

谁能想到将这个简单的属性添加到 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 继承控件中,而不是为每个 DataGrid 重复它。

(叹气。)为什么 MS 不将 IsReadOnly 设为可附加属性..?它会让生活变得如此轻松!

4

0 回答 0