2009-08-20 13 views
17

Tengo un ListBox que está vinculado a ObservableCollection de LogMessages.WPF, XAML: cómo diseñar un ListBoxItem utilizando el enlace en la propiedad del objeto ListBox ItemsSource?

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

Cada mensaje tiene dos parámetros:

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

ListBox se está llena de esos artículos, y necesito código de color (cambiar un color fondo de ListBoxItem) Lista dependiendo de un Severity parámetro de un elemento de LogMessage.

Esto es lo que tengo ahora en XAML de control de usuario que muestra el registro:

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

y un cuadro de lista real:

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

El AlternationConverter se utiliza porque el parámetro de Gravedad de mensaje es de tipo Int (0..3), y podemos cambiar fácilmente entre estilos usando ese.

El concepto es claro, pero hasta ahora no funciona para mí. El color de fondo de ListBoxItem no cambió.

+0

Mi impresión es que esto tiene que ver con {} RelativeSource TemplatedParent. ¿Obtiene errores de enlace en la ventana de salida al depurar la aplicación? –

+0

No hubo errores vinculantes, pero lamentablemente tiene razón, esto no tiene nada que ver con el objeto al que intento hacer referencia. Extrañamente no hay errores vinculantes en la ventana de salida. –

Respuesta

30

Uso ItemContainerStyle:

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

Gracias, esto funcionó como un encanto para mí. –

4

Al igual que Bojan ha comentado, es el RelativeSource cual no debería ser allí. Uso {Binding Path = Gravedad, convertidor = {}} StaticResource BackgroundSeverityConverter cuando estás unión a su objeto de datos. RelativeSource.TemplatedParent es para enlazar a ListBoxItem.

Adicionalmente, una especie de manía mía, se podría considerar el uso de disparadores, por ejemplo:

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

Pero eso es sólo una preferencia personal .... lo que tienes ahí debería funcionar bien si se fija la Unión.

+0

He solucionado el problema con la solución de Kent, pero voy a probar la suya también. Podría ser útil en alguna situación externa, por supuesto. El propósito de usar AlternationConverter fue que interpreta fácilmente datos enteros que teníamos en LogMessage. Su enfoque es más general, por lo que será aplicable en más situaciones. ¡Gracias! –

Cuestiones relacionadas