在尝试子类化wpf的DataGrid控件时,我遇到了一些奇怪的行为。
让我说我有:
class CustomDataGrid<T> : DataGrid { ... }
class FooDataGrid : CustomDataGrid<Foo> { }
还有一些xaml:
<local:FooDataGrid ItemsSource="..." SelectionMode="Single" SelectionUnit="FullRow" />
一切正常,我一次只能选择一行。但是,如果我尝试通过执行以下操作更改SelectionMode / SelectionUnit的默认值:
static CustomDataGrid()
{
DataGrid.SelectionModeProperty.OverrideMetadata( typeof( CustomDataGrid<T> ), new FrameworkPropertyMetadata( DataGridSelectionMode.Single ) );
DataGrid.SelectionUnitProperty.OverrideMetadata( typeof( CustomDataGrid<T> ), new FrameworkPropertyMetadata( DataGridSelectionUnit.FullRow ) );
}
将xaml更改为:
<local:FooDataGrid ItemsSource="..." />
它似乎并不关心我的默认值,我可以选择多行。现在,奇怪的是,如果我尝试再次在xaml中手动设置属性(同时仍然在静态构造函数中具有默认值),我仍然可以选择多行。所以以某种方式用这些依赖属性的工作方式覆盖元数据螺丝,导致wpf不关心xaml中设置的值。
有没有人知道这里发生了什么?
答案 0 :(得分:1)
实际的多选行为由CanSelectMultipleItems
属性控制,默认为true
,仅在SelectionMode
属性更改时更新。覆盖默认值不会调用属性更改处理程序,因此CanSelectMultipleItems
仍为true
。现在,如果您尝试在XAML中设置值,依赖项属性系统将开始对您起作用:默认值为DataGridSelectionMode.Single
,并且您将属性设置为相同的值,因此不会再次调用属性更改处理程序,也不会发生任何事情。< / p>
最简单的解决方案 - 添加非静态构造函数并初始化CanSelectMultipleItems
属性:
public CustomDataGrid()
{
CanSelectMultipleItems = SelectionMode != DataGridSelectionMode.Single;
}
此外,您可以为数据网格声明自定义样式并在样式中设置属性值 - 这似乎更像是“WPF方式”来执行此类操作。