2009-07-29 25 views
0

ItemsSourceコレクション内のアイテムのタイプに応じて、wpfデータグリッドの列のスタイリングを変更できるかどうかは疑問です。ItemsSourceのデータ型に応じてwpfデータグリッドのセルスタイルが異なる

私はwpfツールキットのwpfデータグリッドを持っています。グリッド内の単一の行は、ItemsSourceコレクションのアイテムの種類に応じてスタイルを設定する必要があります。したがって、すべてのアイテムは同じ基本クラスタイプですが、いくつかの派生タイプの列は異なるスタイルを取得する必要があります。

これは可能ですか?

はい、いくつかの方法でそれを行うことが可能です:-)

答えて

2

ありがとうございます。私が行っているのは、入力のタイプに応じて値を選択する、独自のカスタム "typeswitch"コンバータを作成することです。

public class TypeSwitchConverter : Dictionary<Type, object>, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, .CultureInfo culture) 
    { 
     foreach (var mapping in this) 
     { 
      if (mapping.Key.IsAssignableFrom(value.GetType())) 
      { 
       return mapping.Value; 
      } 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

そしてあなたのセルのテンプレートのトップレベルの要素のStyleのバインディングを使用し、必要に応じてその結合のために上記のコンバータを使用:このように。ここでは単純化した例では、それを使用してListBoxでそのスタイルアイテムです:

<ListBox ItemsSource="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"> 
        <TextBlock.Style> 
         <Binding> 
          <Binding.Converter> 
           <my:TypeSwitchConverter> 
            <Style x:Key="{x:Type cor:Int32}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Red" /> 
            </Style> 
            <Style x:Key="{x:Type cor:String}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Green" /> 
            </Style> 
            <Style x:Key="{x:Type sys:Uri}" TargetType="{x:Type TextBlock}"> 
             <Setter Property="Background" Value="Blue" /> 
            </Style> 
           </my:TypeSwitchConverter> 
          </Binding.Converter> 
         </Binding> 
        </TextBlock.Style> 
       </TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

お返事ありがとうございます!問題は、アイテムコレクションのタイプによって異なるコントロールをスタックパネルに追加したいということだけです。それをどうやって解決しますか? したがって、の場合、ItemsCollectionのタイプに応じて異なるコントロールオブジェクトを追加する必要があるがあります。 –

+0

次に、上記の 'TypeSwitchConverter'を使用して' ItemTemplate'プロパティを別のテンプレートにバインドしてください。 –

+0

実際には、申し訳ありませんが、わずかな修正 - ItemTemplateを設定するときに現在のアイテムを持たないため、直接バインドすることはできません。したがって、任意のタイプの単一の要素(例えば、 'ContentPresenter')を含む' ItemTemplate'を定義し、次にスイッチコンバータを使用してその要素の 'Template'プロパティをバインドします。 –

4

A WPFのみのソリューション:

、私は少し遅れてのパーティーのためにしていますが、他の誰かがこのような何かをしようとしている場合WPFのみのソリューションがあります。直接、適切なDataTemplateを探しますが、我々は間接的に、このようのContentPresenterを使用することができます何のDataGridColumnクラスはありません:CellTemplate内DataTemplateの内部のContentPresenterを挟んで

<Window.Resources> 
    <DataTemplate DataType="{x:Type models:Employee}"> 
     <Grid>...</Grid> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type models:Manager}"> 
     <Grid>...</Grid> 
    </DataTemplate> 
</Window.Resources> 

<DataGrid ... > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="MyColumn"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ContentPresenter Content="{Binding}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

が、私たちは、所望の結果を達成します。

+0

素晴らしいソリューションですが、それを複数の列に拡張することは可能ですか? DataTypeのみに依存する場合、さまざまな列(たとえば、タイトルや従属項目)に「適切な」データテンプレートを選択するにはどうすればよいですか? – mechanic

関連する問題