2012-06-22 6 views
7

Ich habe ein Problem mit der Einstellung HighlightBrushKey eines SelectedItem eines Listbox in WPF. Meine Absicht war, die Farbe eines Items abhängig von einem gegebenen Booleschen Wert festzulegen, der im Code liegt.WPF Listenfeld ändern Hervorhebungsfarbe bei Auswahl

Ich habe versucht, folgende Schritte:

  • einen Converter Implementierung, die boolean Überprüfung und die richtige Farbe zurück.

    Beispiel:

    <ribbon:RibbonWindow.Resources> 
        <l:WindowControl x:Key="ListBoxItemBackgroundConverter" /> 
        <Style x:Key="listBoxStyle" TargetType="{x:Type ListBoxItem}"> 
         <Style.Resources> 
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={x:Static SystemColors.HighlightBrushKey}, Converter={StaticResource ListBoxItemBackgroundConverter}}"/> 
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{Binding Source={x:Static SystemColors.ControlBrushKey}, Converter={StaticResource ListBoxItemBackgroundConverter}}"/> 
         </Style.Resources> 
        </Style> 
    </ribbon:RibbonWindow.Resources> 
    

    Das Problem dabei war, dass die Methode Konvertieren nur einmal aufgerufen wurde, aber ich brauche die Converter jedes Mal, wenn ich ein Element auswählen aufgerufen werden und die Boolesche überprüfen. Wie ein Auslöser, aber mit der "HighlightBrushKey".

    Converter:

    public object Convert(object value, Type targetType, 
             object parameter, CultureInfo culture) 
    { 
        if(currentField == null) 
         return Brushes.Yellow; 
        if (currentField.Save) 
         return Brushes.LightGreen; 
        else 
         return Brushes.Yellow; 
    } 
    
  • Meine nächste Idee wurde Einstellung "HighlightBrushKey" auf "Transparent" und die item.Background manuell in Code zu ändern. Das Problem hier war, dass mein Artikel wurde weiß und die Hintergrundfarbe konnte nicht

    Beispiel zu sehen:

    <ListBox.Resources> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
    </ListBox.Resources> 
    

Vielen Dank im Voraus! :)

+2

Schöne erste Frage Andy, gut gebaut mit präzisen Beispielen genau das, was Sie zu markieren versuchten! +1 – ThePower

+0

@Andy Was ist currentField1 in Ihrem Konverter? Wie bekommst du das in Converter? Können Sie versuchen, an "currentField" (d. H. YourViewModelProperty) im Stil unsichtbar zu binden. – akjoshi

+0

currentField ist ein Objekt. Klassenname ist Feld und hat eine Boolesche Eigenschaft namens "Speichern". Wie kann ich in XAML daran binden? – Andy

Antwort

1
<Style x:Key="listBoxStyle" TargetType="{x:Type ListBox}"> 
    <Style.Resources> 
     <!-- Background of selected item when focussed --> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> 
     <!-- Background of selected item when not focussed --> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" /> 
    </Style.Resources> 
</Style> 

<ListBox Style="{StaticResource listBoxStyle}"> 
</ListBox> 
+0

prüft, danke für Ihre Antwort, aber das löst mein Problem nicht. Ich kenne diese Zeilen, aber ich habe eine bestehende Abhängigkeit zwischen der Farbe (Ihr Beispiel: color = "Red") und einem booleschen Wert currentField.Save, ein Objekt in Runtime. Wenn es falsch ist, sollte die Farbe gelb sein und wenn es wahr ist, sollte die Farbe grün sein. – Andy