2013-06-28 80 views
2

我遇到了一些奇怪的行爲,同時試圖對wpf的DataGrid控件進行子類化。DependencyProperty的默認值和子類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

實際多選行爲由CanSelectMultipleItems屬性控制,該屬性默認爲true,僅在SelectionMode屬性發生更改時才更新。覆蓋默認值不會調用屬性更改處理程序,因此CanSelectMultipleItems仍然爲true。現在,如果您嘗試在XAML中設置值,則依賴項屬性系統開始對您工作:默認值爲DataGridSelectionMode.Single,並且您將屬性設置爲相同的值,因此屬性更改的處理程序不會再次調用並且什麼也不會發生。

Simpliest解決方案 - 添加非靜態構造函數和初始化CanSelectMultipleItems屬性:

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

你也可以聲明爲您的數據網格的自定義樣式和設置屬性值的風格 - 這似乎是一個更「WPF路「做這樣的事情。

+0

啊,這很完美!是的,我可能應該有一個風格的默認值,而不是好點。非常感謝! – Chris