Oui, il est possible de le faire de plusieurs façons. Celui que je voudrais écrire est votre propre "custom switch" convertisseur qui sélectionne une valeur en fonction du type d'entrée. Comme ceci:
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();
}
}
Et puis utilisez une liaison pour la Style
de l'élément de niveau supérieur dans le modèle de votre cellule, et utiliser le convertisseur ci-dessus pour que la liaison au besoin. Voici un exemple simplifié que les styles des éléments dans une ListBox
utilisant:
<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>
Merci pour la réponse rapide! Le problème est que je veux ajouter des contrôles différents dans un panneau de pile en fonction du type dans la collection d'éléments. Comment résoudriez-vous cela? Donc, en tant que si doit avoir ajouté un objet de contrôle différent en fonction du type dans ItemsCollection. –
Ensuite, il suffit de lier la propriété ItemTemplate à l'aide de 'TypeSwitchConverter' ci-dessus à différents modèles. –
En fait, désolé, une légère correction - vous ne serez pas capable de lier directement parce que vous n'aurez pas d'élément en cours lors de la définition de ItemTemplate. Vous définissez donc un ItemTemplate contenant un seul élément de tout type (par exemple ContentPresenter), puis liez la propriété Template de cet élément à l'aide d'un convertisseur de commutateur. –