Ja, es möglich ist, sie auf verschiedene Weise zu tun. Die eine, die ich gehen würde, ist das Schreiben eines eigenen benutzerdefinierten "Typswitch" -Konverters, der je nach Art der Eingabe einen Wert auswählt. Wie folgt aus:
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();
}
}
Und dann eine Bindung für die Style
der Top-Level-Element in Vorlage für Ihr Handy nutzen, und verwenden Sie die oben Konverter für die je nach Bedarf zu binden. Hier ist ein vereinfachtes Beispiel, dass Arteinzelteile in einem ListBox
mit ihm:
<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>
Danke für die schnelle Antwort! Das Problem ist nur, dass ich verschiedene Steuerelemente in einem Stapelbereich je nach dem Typ in der Elementauflistung hinzufügen möchte. Wie würdest du das lösen? So wie wenn eine , die je nach Typ in der ItemsCollection sollte verschiedene Steuerelement Objekt hinzugefügt haben. –
Dann binden Sie einfach die 'ItemTemplate' -Eigenschaft mit' TypeSwitchConverter' oben auf andere Vorlagen. –
Eigentlich eine kleine Korrektur - Sie können es nicht direkt binden, weil Sie beim Setzen von ItemTemplate kein aktuelles Objekt haben. Sie definieren also eine 'ItemTemplate', die ein einzelnes Element eines beliebigen Typs (z. B.' ContentPresenter') enthält, und binden dann die 'Template'-Eigenschaft dieses Elements mithilfe eines Switch-Konverters. –