web-dev-qa-db-ja.com

WPF、XAML:ListBox ItemsSourceオブジェクトのプロパティのバインディングを使用してListBoxItemのスタイルを設定するにはどうすればよいですか?

LogMessagesのObservableCollectionにバインドされているListBoxがあります。

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

各メッセージには2つのパラメータがあります。

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

ListBoxはそれらのアイテムでいっぱいになり、color-codeListBoxItem背景色を変更する---に応じてリストを変更する必要があります- 重大度 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}" />

メッセージのSeverityパラメーターのタイプがInt(0..3)であり、それを使用してスタイルを簡単に切り替えることができるため、AlternationConverterが使用されます。

コンセプトは明確ですが、今のところ私にはうまくいきません。 ListBoxItemの背景色は変更されていません。

16
Igor Malin

ItemContainerStyleを使用します:

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

Bojanがコメントしたように、そこにあるべきではないのはRelativeSourceです。データオブジェクトにバインドするときは、{Binding Path = Severity、Converter = {StaticResource BackgroundSeverityConverter}}を使用します。 RelativeSource.TemplatedParentは、ListBoxItemにバインドするためのものです。

さらに、私のペットのようなもので、トリガーの使用を検討できます。たとえば、次のようになります。

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

しかし、それは個人的な好みです....バインディングを修正すれば、そこにあるものはうまく機能するはずです。

4
Bubblewrap