ItemsSource コレクションのアイテムの種類に応じて、wpf データグリッドの列のスタイルを変更できるかどうか疑問に思っています。
wpf ツールキットの wpf データグリッドがあります。グリッド内の単一の行は、ItemsSource コレクションのアイテムのタイプに応じてスタイルを設定する必要があります。したがって、すべてのアイテムは同じ基本クラス型ですが、一部の派生型の列は異なるスタイルにする必要があります。
これは可能ですか?
ありがとうございました :-)
WPF のみのソリューション:
私はパーティーに少し遅れていますが、他の誰かがこのようなことをしようとしている場合は、WPF のみの解決策があります。適切な DataTemplate を直接探す DataGridColumn クラスはありませんが、次のように 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>
CellTemplate 内の DataTemplate 内に ContentPresenter を挟むことで、目的の結果が得られます。
Yes, it is possible to do it in several ways. The one I would go for is writing your own custom "typeswitch" converter that selects a value depending on type of input. Like this:
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();
}
}
And then use a binding for the Style
of the top-level element in template for your cell, and use the above converter for that binding as needed. Here's a simplified example that styles items in a ListBox
using it:
<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>