重写WPF DataGrid子类IsReadOnlyProperty元数据致双击命令失效,求方案
解决方案
方案一:通过默认样式设置默认值(推荐)
无需修改依赖属性元数据或在构造函数硬编码,通过自定义DataGrid的默认样式设置IsReadOnly默认值,既保证默认只读,又允许使用时通过本地属性覆盖,同时完全保留DataGrid原有行为(包括双击命令绑定)。
- 在项目的
Generic.xaml(或主题资源文件)中,为NewDataGrid创建继承自DataGrid默认样式的自定义样式:
<Style TargetType="{x:Type local:NewDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}"> <Setter Property="IsReadOnly" Value="True"/> <!-- 可添加其他自定义默认属性配置 --> </Style>
- 确保自定义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
相关产品推荐
相关产品推荐

