WPF, XAML: Comment le style d'un ListBoxItem à l'aide de la liaison sur la propriété de la zone de liste ItemsSource objet?
J'ai une ListBox qui est lié à ObservableCollection de LogMessages.
public ObservableCollection<LogMessage> LogMessages { get; set; }
public LogMessageData()
{
this.LogMessages = new ObservableCollection<LogMessage>();
}
Chaque Message possède deux paramètres:
public class LogMessage
{
public string Msg { get; set; }
public int Severity { get; set; }
//code cut...
}
ListBox est se remplir avec les Éléments, et j'ai besoin de code couleur (changer un couleur d'arrière-plan de ListBoxItem) liste selon un Gravité paramètre d'une LogMessage élément.
Voici ce que j'ai maintenant dans le code XAML de contrôle de l'utilisateur en montrant le journal:
<UserControl.Resources>
<AlternationConverter x:Key="BackgroundSeverityConverter">
<SolidColorBrush>Green</SolidColorBrush>
<SolidColorBrush>Yellow</SolidColorBrush>
<SolidColorBrush>Red</SolidColorBrush>
</AlternationConverter>
<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}">
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource TemplatedParent},
Path=Severity,
Converter={StaticResource BackgroundSeverityConverter}}"/>
</Style>
<DataTemplate x:Key="LogDataTemplate">
<TextBlock x:Name="logItemTextBlock" Width="Auto" Height="Auto"
Text="{Binding Msg}"/>
</DataTemplate>
</UserControl.Resources>
et d'une véritable zone de liste:
<ListBox IsSynchronizedWithCurrentItem="True"
ItemTemplate="{DynamicResource LogDataTemplate}"
ItemsSource="{Binding LogFacility.LogMessages}"
x:Name="logListBox" Grid.Row="1"
ItemContainerStyle="{StaticResource BindingAlternation}" />
La AlternationConverter est utilisé parce que la Gravité paramètre de message est de type Int (0..3), et on peut facilement basculer entre les styles à l'aide de celui-là.
Le concept est clair, mais pour l'instant il ne fonctionne pas pour moi. La couleur de Fond de ListBoxItem n'a pas changé.
- Mon intuition est que cela a à voir avec {RelativeSource TemplatedParent}. Ne vous obtenez une erreur de liaison dans la fenêtre de sortie lors du débogage de l'application?
- Il n'y avait pas de liaison des erreurs, mais malheureusement, vous avez raison, cela n'a rien à voir avec l'objet que je suis en train de référence. Étrangement aucune liaison des erreurs dans la fenêtre de sortie.
Vous devez vous connecter pour publier un commentaire.
Utilisation
ItemContainerStyle
:Comme Bojan a commenté, c'est la RelativeSource qui ne devrais pas être là.
Utilisation {Binding Path=Gravité, Converter={StaticResource BackgroundSeverityConverter}} lorsque vous êtes à la liaison à votre objet de données. RelativeSource.TemplatedParent est pour la liaison à ListBoxItem.
En outre, quelque chose de bête noire de la mine, vous pourriez envisager d'utiliser des déclencheurs, par exemple:
Mais c'est juste une question de préférence personnelle....ce que vous avez là devrait fonctionner correctement si vous corrigez la liaison.