我有一个ListBox绑定到LogMessages的ObservableCollection。WPF,XAML:如何使用ListBox ItemsSource对象的属性上的绑定来设置ListBoxItem的样式?
public ObservableCollection<LogMessage> LogMessages { get; set; }
public LogMessageData()
{
this.LogMessages = new ObservableCollection<LogMessage>();
}
每个消息有两个参数:
public class LogMessage
{
public string Msg { get; set; }
public int Severity { get; set; }
//code cut...
}
列表框是越来越填充有那些项目,并且我需要颜色编码(改变背景颜色的 ListBoxItem的)列表取决于LogMessage项目的严重性参数。
这就是我现在在XAML显示日志用户控件:
<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>
和实际列表框:
<ListBox IsSynchronizedWithCurrentItem="True"
ItemTemplate="{DynamicResource LogDataTemplate}"
ItemsSource="{Binding LogFacility.LogMessages}"
x:Name="logListBox" Grid.Row="1"
ItemContainerStyle="{StaticResource BindingAlternation}" />
的AlternationConverter被使用,因为消息的严重性参数的类型的Int(0..3),我们可以轻松地在使用那个样式的样式之间切换。
这个概念很清楚,但到目前为止它不适用于我。 ListBoxItem的背景颜色没有改变。
我的预感是,这与{RelativeSource TemplatedParent}有关。调试应用程序时,在输出窗口中是否有任何绑定错误? – 2009-08-20 10:30:34
没有绑定错误,但不幸的是你是对的,这与我试图引用的对象无关。奇怪的是输出窗口没有绑定错误。 – 2009-08-20 10:54:05