2009-08-20 8 views
17

Ich habe eine ListBox, die an ObservableCollection von LogMessages gebunden ist.WPF, XAML: Wie style ein ListBoxItem mit Bindung für Eigenschaft von ListBox ItemsSource-Objekt?

public ObservableCollection<LogMessage> LogMessages { get; set; } 
public LogMessageData() 
{ 
    this.LogMessages = new ObservableCollection<LogMessage>(); 
} 

Jede Nachricht hat zwei Parameter:

public class LogMessage 
{ 
    public string Msg { get; set; } 
    public int Severity { get; set; } 
    //code cut... 
} 

ListBox mit diesen Gegenständen gefüllt zu werden, und ich muss Farbcode (a Hintergrundfarbe ändern von ListBoxItem) Liste abhängig von Schweregrad Parameter eines LogMessage-Elements.

Hier ist, was ich jetzt in XAML der Benutzersteuerung haben das Protokoll zeigt:

<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> 

und eine tatsächliche ListBox:

ist
<ListBox IsSynchronizedWithCurrentItem="True" 
    ItemTemplate="{DynamicResource LogDataTemplate}" 
    ItemsSource="{Binding LogFacility.LogMessages}" 
    x:Name="logListBox" Grid.Row="1" 
    ItemContainerStyle="{StaticResource BindingAlternation}" /> 

Die AlternationConverter verwendet, da die Schwere Parameter der Nachricht vom Typ Int (0..3), und wir können problemlos zwischen den Stilen wechseln.

Das Konzept ist klar, aber bis jetzt funktioniert es nicht für mich. Die Hintergrundfarbe von ListBoxItem hat sich nicht geändert.

+0

Meine Ahnung ist, dass dies mit {RelativeSource TemplatedParent} zu tun hat. Erhalten Sie verbindliche Fehler im Ausgabefenster beim Debuggen der Anwendung? –

+0

Es gab keine verbindlichen Fehler, aber leider hast du recht, das hat nichts mit dem Objekt zu tun, auf das ich zu verweisen versuche. Seltsam keine verbindlichen Fehler im Ausgabefenster. –

Antwort

30

Verwendung ItemContainerStyle:

<ListBox ItemsSource="{Binding LogMessages}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Background" Value="{Binding Severity, Converter={StaticResource YourBackgroundConverter}}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+0

Danke, das hat wie ein Zauber für mich funktioniert. –

4

Wie Bojan kommentiert, dann ist es die, die es sein Relative shouldnt. Verwenden Sie {Bindungspfad = Schweregrad, Konverter = {StaticResource BackgroundSeverityConverter}}, wenn Sie an Ihr Datenobjekt binden. RelativeSource.TemplatedParent dient zur Bindung an ListBoxItem.

Zusätzlich so etwas wie ein Haustier ärgern von mir, könnten Sie zum Beispiel unter Verwendung von Auslösern, betrachten:

<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Severity}" Value="1"> 
      <Setter Property="Background" Value="Green"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Severity}" Value="2"> 
      <Setter Property="Background" Value="Yellow"/> 
     </DataTrigger> 
     <!-- etc.. --> 
    </Style.Triggers> 
<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 

Aber das ist nur eine persönliche Vorliebe .... was haben Sie da sollte gut funktionieren, wenn Sie beheben die Bindung.

+0

Ich habe das Problem mit Kents Lösung behoben, aber ich werde es auch versuchen. Es könnte natürlich in einer anderen Situation nützlich sein. Der Zweck der Verwendung des AlternationConverters bestand darin, dass er ganzzahlige Daten, die wir in LogMessage hatten, leicht interpretieren konnte. Ihre Vorgehensweise ist allgemeiner, so dass sie in mehr Situationen anwendbar ist. Vielen Dank! –