我正在基於TreeView創建可重用的自定義控件。我對定製控件創建在控制列,這樣的依賴項屬性:如何將樣式應用於自定義控件庫中的DependencyObject
public GridViewColumnCollection Columns
{
get { return (GridViewColumnCollection)GetValue(ColumnsProperty); }
set { SetValue(ColumnsProperty, value); }
}
public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.Register("Columns", typeof(GridViewColumnCollection), typeof(TreeListView), new PropertyMetadata(new GridViewColumnCollection()));
這讓我指定XAML一堆列。問題在於我需要第一列具有自定義單元格模板。我正要從GridViewColumn派生類,像這樣來處理這個:
public class TreeGridViewColumn : GridViewColumn
{
}
,然後給它在Generic.xaml自定義控制所需的樣式:
<Style TargetType="{x:Type local:TreeGridViewColumn}">
<Setter Property="CellTemplate">
<Setter.Value>
<DataTemplate>
<Border Background="Black" /> <!-- Just for example -->
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
然而,樣式從不應用於TreeGridViewColumn的實例。我知道,我可能需要添加:
DefaultStyleKeyProperty.OverrideMetadata(typeof(TreeGridViewColumn), new FrameworkPropertyMetadata(typeof(TreeGridViewColumn)));
但是我不能這樣做,因爲的GridColumn基類是不是FrameworkObject,它是一個DependencyObject的。如何將樣式應用於自定義控件庫中定義的GridViewColumn的後代?
您不能以任何方式將Style應用於GridViewColumn,因爲它不是FrameworkElement,因此也不是可風化的。它沒有Style屬性。 – Clemens
@Clemens:正確。我想我可以在解決這個問題時做得更好 - 當我寫這個問題的時候 - 我正在嘗試創建一個GridViewColumn的衍生物,並根據我的需要重寫CellTemplate。我花了一些時間使用Reflector來查看DataGrid列如何執行此操作(即Text列等),看起來不幸的是,它們只是在代碼中手動創建默認模板。這對他們來說很好,因爲他們的模板只有一個或兩個框架元素。我的模板太複雜了,所以我需要找到另一條路線。 – user3690202