ありがとうございます。私が行っているのは、入力のタイプに応じて値を選択する、独自のカスタム "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>
お返事ありがとうございます!問題は、アイテムコレクションのタイプによって異なるコントロールをスタックパネルに追加したいということだけです。それをどうやって解決しますか? したがって、の場合、ItemsCollectionのタイプに応じて異なるコントロールオブジェクトを追加する必要があるがあります。 –
次に、上記の 'TypeSwitchConverter'を使用して' ItemTemplate'プロパティを別のテンプレートにバインドしてください。 –
実際には、申し訳ありませんが、わずかな修正 - ItemTemplateを設定するときに現在のアイテムを持たないため、直接バインドすることはできません。したがって、任意のタイプの単一の要素(例えば、 'ContentPresenter')を含む' ItemTemplate'を定義し、次にスイッチコンバータを使用してその要素の 'Template'プロパティをバインドします。 –