You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写WPF DataGrid子类IsReadOnlyProperty元数据致双击命令失效,求方案

解决方案

方案一:通过默认样式设置默认值(推荐)

无需修改依赖属性元数据或在构造函数硬编码,通过自定义DataGrid的默认样式设置IsReadOnly默认值,既保证默认只读,又允许使用时通过本地属性覆盖,同时完全保留DataGrid原有行为(包括双击命令绑定)。

  1. 在项目的Generic.xaml(或主题资源文件)中,为NewDataGrid创建继承自DataGrid默认样式的自定义样式:
<Style TargetType="{x:Type local:NewDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
    <Setter Property="IsReadOnly" Value="True"/>
    <!-- 可添加其他自定义默认属性配置 -->
</Style>
  1. 确保自定义DataGrid类标记[StyleTypedProperty(Property = "Style", StyleTargetType = typeof(DataGrid))](若未添加),保证样式继承生效。

这种方式遵循WPF样式优先级规则,本地属性设置(如<local:NewDataGrid IsReadOnly="False"/>)会覆盖样式默认值,且不会干扰DataGrid原有依赖属性的元数据、回调与事件逻辑,双击命令绑定可正常工作。

方案二:正确重写依赖属性元数据

若必须通过重写元数据修改默认值,需保留原有元数据的关键属性(回调、标志等),避免破坏DataGrid原有行为。

错误写法仅设置默认值,丢失原有元数据的关键信息,导致输入事件异常:

// 错误:丢失原有元数据的回调与标志
IsReadOnlyProperty.OverrideMetadata(typeof(NewDataGrid), new FrameworkPropertyMetadata(true));

正确做法是先获取DataGrid原有IsReadOnly元数据,复制其回调、属性标志等参数后修改默认值:

static NewDataGrid()
{
    var originalMetadata = (FrameworkPropertyMetadata)DataGrid.IsReadOnlyProperty.GetMetadata(typeof(DataGrid));
    
    DataGrid.IsReadOnlyProperty.OverrideMetadata(
        typeof(NewDataGrid), 
        new FrameworkPropertyMetadata(
            true,
            originalMetadata.PropertyChangedCallback,
            originalMetadata.CoerceValueCallback,
            originalMetadata.IsAnimationProhibited,
            originalMetadata.DefaultUpdateSourceTrigger,
            originalMetadata.Journal
        )
    );
}

此方式既修改了IsReadOnly默认值,又保留了DataGrid原有依赖属性的全部行为逻辑,双击命令绑定可恢复正常。


内容的提问来源于stack exchange,提问作者Dan Lyons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:48