WPF基于属性为ListBoxItem着色

时间:2014-06-18 14:44:18

标签: c# wpf

我查看了this answer,但出于某种原因它并不适合我。我正在使用一个Observable LookupEntity对象集合:

public class LookupEntity
{
    public bool IsSelected { get; set; }
    public int Id { get; set; }
    public string Code { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public bool IsInactive { get; set; }
 }

我需要的是非活动项目的背景颜色(IsInactive = True)与其他项目不同。我尝试了两种方法。第一种是使用DataTrigger和Template。这应该有效,但不是:

    <ListBox x:Name="RecordList"
    Grid.Row="2"
    MinWidth="200"
    ItemsSource="{Binding MaintenanceList, Mode=TwoWay}"
    HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"
    VerticalAlignment="Stretch"
    BorderThickness="0"
    SelectedValue="{Binding SelectedItem, Mode=TwoWay}"                            
    IsEnabled="{Binding ContentVM.AddEnabled}"
    SelectionChanged="ListBox_SelectionChanged">
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsInactive}" Value="True">
                    <Setter Property="Background" Value="PaleVioletRed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <DataTemplate DataType="{x:Type utility:LookupEntity}">
            <TextBlock 
        Text="{Binding Title}"
        ToolTip="{Binding Description}"
        TextWrapping="NoWrap"
        HorizontalAlignment="Left"/>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

第二种方法有效,但它取决于LookupEntity对象中的Background Color属性。我不喜欢这种方法,因为它给一个不应该知道它如何显示的对象赋予显示责任。将此属性添加到LookupEntity:

    public SolidColorBrush BackgroundColor
    {
        get { return IsInactive ? Brushes.PaleVioletRed : Brushes.Transparent; }
    }

绑定DataTemplate的Background属性有效,但这是不可接受的。

    <ListBox.Resources>
        <DataTemplate DataType="{x:Type utility:LookupEntity}">
            <TextBlock 
        Text="{Binding Title}"
        ToolTip="{Binding Description}"
        TextWrapping="NoWrap"
        HorizontalAlignment="Left"
        Background="{Binding BackgroundColor}"/>
        </DataTemplate>
    </ListBox.Resources>

我想将背景颜色的责任放在皮肤/资源中,但我无法使用此设置。有没有我错过的东西?

1 个答案:

答案 0 :(得分:3)

您的LookupEntity课程应该实现INotifyPropertyChanged界面。当PropertyChanged更改时,您应该提出IsInactive事件。

public class LookupEntity : INotifyPropertyChanged
{
    private bool _isInactive;

    public bool IsSelected { get; set; }
    public int Id { get; set; }
    public string Code { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }

    public bool IsInactive
    {
        get { return _isInactive; }
        set
        {
            _isInactive = value;
            OnPropertyChanged("IsInactive");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

编辑:您可以尝试直接绑定属性,而不是使用触发器。但是,您需要使用值转换器,您必须实现它。

<Style TargetType="ListBoxItem" Background="{Binding IsInactive, Converter={StaticResource boolToColorConverter}}">
</Style>