DependencyProperty默认值和子类DataGrid中断属性

时间:2013-06-28 09:59:01

标签: c# wpf xaml

在尝试子类化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中设置的值。

有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

实际的多选行为由CanSelectMultipleItems属性控制,默认为true,仅在SelectionMode属性更改时更新。覆盖默认值不会调用属性更改处理程序,因此CanSelectMultipleItems仍为true。现在,如果您尝试在XAML中设置值,依赖项属性系统将开始对您起作用:默认值为DataGridSelectionMode.Single,并且您将属性设置为相同的值,因此不会再次调用属性更改处理程序,也不会发生任何事情。< / p>

最简单的解决方案 - 添加非静态构造函数并初始化CanSelectMultipleItems属性:

public CustomDataGrid()
{
    CanSelectMultipleItems = SelectionMode != DataGridSelectionMode.Single;
}

此外,您可以为数据网格声明自定义样式并在样式中设置属性值 - 这似乎更像是“WPF方式”来执行此类操作。