2009-08-20 9 views
17

Mam ListBox, który jest powiązany z ObservableCollection z LogMessages.WPF, XAML: Jak ustawić obiekt ListBoxItem przy użyciu powiązania właściwości obiektu ListBox ItemsSource?

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

Każda wiadomość ma dwa parametry:

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

ListBox jest uzyskiwanie wypełnionych tych pozycji i muszę kolorowym kodem (zmiana koloru tło z ListBoxItem) Lista w zależności od parametru o parametrze LogMessage.

Oto co mam teraz w XAML kontroli użytkownika pokazujący dziennik:

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

i rzeczywistą ListBox:

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

AlternationConverter jest używany, ponieważ parametr Ciężkość wiadomości jest typu Int (0..3) i możemy łatwo przełączać się między stylami za pomocą tego.

Koncepcja jest jasna, ale jak dotąd nie działa dla mnie. Kolor tła ListBoxItem nie zmienił się.

+0

Podejrzewam, że ma to związek z {RelativeSource TemplatedParent}. Czy podczas debugowania aplikacji pojawiają się błędy wiązania w oknie wyjściowym? –

+0

Nie było błędów wiązania, ale niestety masz rację, to nie ma nic wspólnego z obiektem, do którego próbuję się odwołać. Dziwnie nie ma wiążących błędów w oknie wyjściowym. –

Odpowiedz

30

Zastosowanie ItemContainerStyle:

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

Dzięki, to działało dla mnie jak urok. –

4

jak Bojan skomentował, że to RelativeSource których nie powinno tam być. Użyj {Ścieżka powiązania = Istotność, Konwerter = {StaticResource BackgroundSeverityConverter}} podczas wiązania obiektu danych. RelativeSource.TemplatedParent służy do wiązania z ListBoxItem.

Dodatkowo, coś o mnie denerwuje z kopalni, można rozważyć użycie wyzwalaczy, na przykład:

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

Ale to tylko osobiste preferencje .... co masz tam powinien działać dobrze, jeśli naprawić wiązanie.

+0

Naprawiłem problem z rozwiązaniem Kenta, ale spróbuję też twojego. Oczywiście może się przydać w jakiejś zewnętrznej sytuacji. Celem zastosowania AlternationConvertera było łatwe interpretowanie danych liczb całkowitych, które mieliśmy w LogMessage. Twoje podejście jest bardziej ogólne, więc będzie miało zastosowanie w większej liczbie sytuacji. Dzięki! –