2016-09-26 9 views
0

Я разрабатываю настраиваемый элемент управления DataGrid, который основан на стандартном WPF DataGrid, чтобы расширить его с учетом конкретных потребностей клиента.По умолчанию Стиль субконтроля в пользовательском элементе управления DataGrid

Отрывок из моего .cs файла:

public class DataGrid : System.Windows.Controls.DataGrid 
{ 
    #region Constructor 
    static DataGrid() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(DataGrid), 
      new FrameworkPropertyMetadata(typeof(DataGrid))); 
    } 
} 

Отрывок из моего .xaml файла:

<Style TargetType="local:DataGrid" 
     BasedOn="{StaticResource ResourceKey={x:Type DataGrid}}"> 

не используя x:Key на Style теге, я объявляю этот стиль по умолчанию один для управления , Это работает так, как я ожидаю.

То, что я не понимаю, как я правильно объявить по умолчанию стили для субэлементов, которые используются в DataGrid, как DataGridRow, DataGridColumn или DataGridColumnHeader.


Один из способов заявить об этом, как это ...

<Style TargetType="{x:Type DataGridRow}"> 

... и установить CellStyle моего local:DataGrid явно (в противном случае он все еще использует стандартный стиль WPF по какой-то причине (?))

<Setter Property="CellStyle" Value="{StaticResource {x:Type DataGridCell}}"/> 

Когда клиенты используют этот обычай DataGrid локально, они могут изменить стиль, просто ссылаясь на {x:Type DataGridCell}, который Я нахожу довольно элегантен:

<local:DataGrid> 
    <lolcal:DataGrid.CellStyle> 
     <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 

Неудобства объявляя его как Default Style является то, что, когда клиенты используют стандартный WPF DataGrid, Стили по умолчанию будут перезаписаны моим обычаем DataGrid.


Альтернативный способ заключается в использовании атрибута x:Key при указании моего DataGridCell стиля ...

<Style x:Key="DataGridCellStyleKey" TargetType="{x:Type DataGridCell}"> 

... и установить CellStyle из моих local:DataGrid этого ключа

<Setter Property="CellStyle" Value="{StaticResource {x:Type DataGridCell}}" /> 

Таким образом, я не переопределяю стиль по умолчанию, но когда мои клиенты хотят локально модифицировать CellStyle, они должны повторно Ференц x:Key явно:

<local:DataGrid> 
    <local:DataGrid.CellStyle> 
     <Style TargetType="DataGridCell" BasedOn="{StaticResource DataGridCellStyleKey}"> 

Я хочу, чтобы избежать их ссылок на x:Key для простоты и ремонтопригодности причин.


Что я ищу способ, который сочетает в себе лучшее из обоих решений: Установка Row/CellStyles как стили по умолчанию, чтобы избежать необходимости ссылаться жестко закодированные x:Key строк, но и избежать переопределения стилей по умолчанию стандарта WPF DataGrid. Единственное другое решение, о котором я могу думать, это использовать пользовательские элементы управления для DataGridCell и других суб-элементов управления. Является ли это жизнеспособным решением?

ответ

0

Я думаю, вы должны объявить стиль от первого подхода в рамках стиля по умолчанию из пользовательского DataGrid следующим образом:

<Style TargetType="local:DataGrid" BasedOn="{StaticResource ResourceKey={x:Type DataGrid}}"> 
    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridCell"> 
       <!-- Your Default Style here --> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Это не отменяют DataGrids по умолчанию CellStyle и может изменен пользователем легко ,

+0

Я просто пробовал это, но не могу понять, как пользователи могут распространять мой стандартный стиль при создании пользовательского DataGrid в XAML. С помощью '