2009-08-20 14 views
17

LogMessages'ın ObservableCollection'a bağlı bir ListBox'um var.WPF, XAML: Nasıl bir ListBoxItem ListBox ItemsSource nesnesinin özelliği üzerinde bağlayıcı kullanarak stili?

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

Her İleti iki parametresi vardır:

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

ListBox bu öğeler ile dolu oluyor ve ben renk kodu (değiştirmek arka plan rengi ait ListBoxItem) liste gerekir LogMessage öğesinin Severity parametresine bağlı olarak.

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

ve gerçek bir ListBox: Burada

Ben günlüğü gösteren kullanıcı denetiminin XAML şimdi ne var

mesajın Şiddeti parametre tipidir çünkü AlternationConverter kullanılır
<ListBox IsSynchronizedWithCurrentItem="True" 
    ItemTemplate="{DynamicResource LogDataTemplate}" 
    ItemsSource="{Binding LogFacility.LogMessages}" 
    x:Name="logListBox" Grid.Row="1" 
    ItemContainerStyle="{StaticResource BindingAlternation}" /> 

Int (0..3) ve bunu kullanarak stiller arasında kolayca geçiş yapabiliriz.

Kavram açık, ama şu ana kadar benim için çalışmıyor. ListBoxItem'in arka plan rengi değişmedi.

+0

Önsezim, bunun {RelativeSource TemplatedParent} ile ilgili olması. Uygulamayı hata ayıkladığınızda çıktı penceresinde herhangi bir bağlantı hatası alıyor musunuz? –

+0

Bağlama hataları yoktu, ancak maalesef haklısınız, bunun için başvurmaya çalıştığım nesne ile ilgisi yok. Çıktı penceresinde garip hata yok. –

cevap

30

Kullanım ItemContainerStyle:

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

Teşekkürler, bu benim için bir çekicilik gibi çalıştı. –

4

Bojan yorumladı gibi, orada olmamalı RelativeSource bu. Veri nesnesine bağlandığınızda, {Binding Path = Severity, Dönüştürücü = {StaticResource BackgroundSeverityConverter}} kullanın. RelativeSource.TemplatedParent, ListBoxItem öğesine bağlanmak içindir. Eğer onarırlarsa ince orada çalışması gerektiğini ne var ....

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

Ama bu sadece kişisel bir tercih: Ayrıca

, benim bir evcil huysuzlaştırmak şey, örneğin, tetikleyicileri kullanarak düşünebiliriz bağlayıcı.

+0

Sorunu Kent'in çözümüyle düzelttim, ama ben de seninkini deneyeceğim. Elbette, bazı dışsal durumlarda yararlı olabilir. AlternationConverter kullanmanın amacı, LogMessage'de sahip olduğumuz tamsayı verilerini kolayca yorumlamasıydı. Yaklaşımınız daha geneldir, bu yüzden daha fazla durumda geçerli olacaktır. Teşekkürler! –