如何添加全局“IsReadOnly”所有 DataGridTextColumn 的样式

发布于 2024-10-16 17:27:57 字数 2627 浏览 2 评论 0原文

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

除了一个。

如何为 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" />

有没有一种方法可以全局添加此“Is​​ReadOnly”设置,在 ResourceDictionary 文件中,到我的所有 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 添加到网格样式,但这会使所有列都不可编辑!

谁能想到一种快速简便的方法来将这个简单的属性添加到 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 设为可附加属性..?这会让生活变得更加轻松!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文