我有一个DataGrid的子类,它提供了一些附加功能,并修改了它的一些属性的默认值。有一点特别需要注意的是,我希望网格在默认情况下是只读的,所以我在它的构造函数中设置了IsReadOnly = true
。
最近,我遇到了一个问题,即在模板中使用网格会导致无论模板中如何设置IsReadOnly
都是只读的。查看依赖项属性优先级页面,我得出结论,IsReadOnlyProperty
的overriding metadata是更改其默认值的正确方法:
IsReadOnlyProperty.OverrideMetadata(typeof(NewDataGrid), new FrameworkPropertyMetadata(true));
虽然这解决了控件模板的问题,但似乎会破坏鼠标双击命令绑定:
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{StaticResource DoubleClickCommand}"/>
</DataGrid.InputBindings>
有没有更好的方法来更改IsReadOnly
的默认值而不破坏鼠标绑定和/或模板?
1条答案
按热度按时间7nbnzgx91#
我怀疑您的问题是否与覆盖
DataGrid.IsReadOnly
属性的默认值有关。只读DataGrid
和鼠标输入事件之间没有逻辑关系。相反,它看起来像鼠标事件是由
DataGrid
的内部元素(如DataGridCell
)处理的,与控件的只读状态无关。例如,双击DataGrid
的背景将按预期工作,而单击单元格(或单元格的内容)则不会。要解决这个问题,我建议覆盖控件的
Control.OnMouseDoubleClick
和/或Control.OnPreviewMouseDoubleClick
方法。这通常应该是注册事件处理程序之前的第一种方法。首先重写自定义控件或扩展控件的虚拟成员。它会给予你更好的控制,你的代码看起来也更干净。
这是因为,即使重写是虚拟事件调用器(例如
Control.OnPreviewMouseDoubleClick
),并且控件决定不引发公共关联事件,也总是会调用重写。因此,不要注册鼠标手势,而是覆盖继承的事件调用器:
这与建议的修复程序无关,而是关于原始实现的一般建议:使用
StaticResource
标记扩展设置MouseBinding.Command
的方式看起来很奇怪。命令应该是RoutedCommand
,通常定义为static
,并在XAML中使用x:Static
扩展名引用: