2016-09-26 29 views
0

標準のWPF DataGridから派生したカスタムのDataGridコントロールを開発しており、クライアント固有のニーズに合わせて拡張しています。カスタムDataGridコントロールのサブコントロールのデフォルトスタイル

.csファイルの抜粋:私の.xamlファイルの

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

スニペット:

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

Styleタグにx:Keyを使用していないことでは、私は、コントロールの既定一つとして、このスタイルを宣言します。これは私の期待通りに機能します。私は得ることはありません何

は私が正しくDataGridRowDataGridColumnまたはDataGridColumnHeaderのように、DataGridで使用されているサブコントロールのデフォルトスタイルを宣言する方法です。


一つの方法は...このよう

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

それを宣言することです...そして(それ以外の場合は、まだいくつかの理由のための標準的なWPFのスタイルを使用しています(明示的に私のlocal:DataGridCellStyleを設定しますか? ))

<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}}"> 

デフォルトスタイルとしてそれを宣言することの欠点は、クライアントが標準WPF DataGridを使用している場合、デフォルトのスタイルが私のカスタムDataGridによって上書きされていることです。


別の方法は...私のDataGridCellスタイルを指定するときにx:Key属性を使用することです

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

...とlocal:DataGridこのキー

<Setter Property="CellStyle" Value="{StaticResource {x:Type DataGridCell}}" /> 
に自分の CellStyleを設定します

この方法では、既定のスタイルをオーバーライドしませんが、クライアントがCellStyleをローカルで変更する場合は、明示的x:Keyをフェレンス:

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

私はシンプルさと保守性の理由からx:Keyを参照し、それらを避けたいと思います。

私は何を探していますが、両方のソリューションの最善を組み合わせた方法です

:ハードコードされたx:Key文字列を参照する必要性を回避するために、デフォルトのスタイルとしてRow/CellStylesを設定するだけでなく、標準のデフォルトのスタイルをオーバーライド避けますWPF DataGrid。私が考えることができる唯一の他の解決策はDataGridCellと他のサブコントロールのカスタムコントロールを使用することです。これは実行可能なソリューションですか?

私はあなたが以下のようにカスタムデータグリッドのデフォルトスタイルの範囲であなたの最初のアプローチからスタイルを宣言するために持っていると思う

答えて

0

<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> 

これはデフォルトのデータグリッドのCellStyleを上書きしないであろうと、ユーザにより容易に変更されたことができます。

+0

XAMLでカスタムDataGridを作成するときに、ユーザーが自分の標準スタイルをどのように拡張できるかわかりません。 '' Style TargetType = "DataGridCell" BasedOn = "{StaticResource {x:Type DataGridCell}}">を使用して、標準のWPF DataGridを参照していますが、カスタムDataGridスタイルを基にしてください。 –

+0

これで、ユーザーは新しいスタイルだけを簡単に設定できます。 Cellstyleを基本として使用することはできません。 BasedOn = "{StaticResource {x:Type DataGridCell}}"を使用すると、型から基本スタイルを参照できます。カスタムDataGridはDataGridCellの新しい型を提供しないため、カスタムDataGrid CellStyleとグローバルなもの(これらのスタイルはDataGridから独立しています)を決める方法はありません。 – WPFGermany

関連する問題