根据条件更改GridViewColumn文本颜色

时间:2015-12-15 15:22:47

标签: wpf listview datagridviewcolumn

这是我的GridViewColumn

<GridViewColumn Width="180" Header="Status">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock x:Name="Txt" Text="{Binding Status}" Foreground="Yellow" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

状态field是我的绑定对象的属性,我想要做的就是更改此GridViewColumn颜色,但这次基于条件:

我还有一个名为StatusMessage的另一个属性,它很简单enum

public enum StatusMessage
{
    InProcess,
    Done,
    Wait
}

所以这个enum属性一直在变化,对于这个enum我想定义不同颜色的每个值。 有可能吗?

修改

我的View模型类继承自BaseObservableObject

public class BaseObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> raiser)
    {
        var propName = ((MemberExpression)raiser.Body).Member.Name;
        OnPropertyChanged(propName);
    }

    protected bool Set<T>(ref T field, T value, [CallerMemberName] string name = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(name);
            return true;
        }
        return false;
    }
}

我的属性:

public string Status
{
    get { return _status; }
    set
    {
        _status = value;
        OnPropertyChanged();
    }
}

public StatusMsg StatusMessage
{
    get { return _statusMsg; }
    set {
        _statusMsg = value;
        OnPropertyChanged();
    }
}

XAML:

<GridViewColumn Width="180" Header="Status" DisplayMemberBinding="{Binding Status}">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Foreground="{Binding StatusMsg,Converter={c:StatusMessageToColorConverter}}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

StatusMessageToColorConverter与建议的@ grek40相同,但我的TextBlock Foreground仍未改变。

2 个答案:

答案 0 :(得分:3)

我首先关注价值转换,然后我说一些关于其他要求的事情(“所以这个枚举属性一直在变化,对于这个枚举的每个值,我想要定义不同的颜色。”)

由于您有枚举值但想要具有颜色规范,因此需要转换该值。这可以通过IConverter接口的实现来完成。在XAML中引用转换器有不同的方法,我还从MarkupExtension继承,因此我可以直接访问转换器。

public class StatusMessageToColorConverter : MarkupExtension, IValueConverter
{
    // one way converter from enum StatusMessage to color
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is StatusMessage && targetType == typeof(Brush))
        {
            switch ((StatusMessage)value)
            {
                case StatusMessage.InProcess:
                    return Brushes.Yellow;
                case StatusMessage.Done:
                    return Brushes.Green;
                case StatusMessage.Wait:
                    return Brushes.Red;
            }
        }
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public StatusMessageToColorConverter()
    {
    }

    // MarkupExtension implementation
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

如您所见,如果输入值的类型为StatusMessage且目标类型为typeof(Brush),那么我会进行转换,这是Foreground属性的类型。我只选择了一些颜色,如果你愿意,你可以使用不同颜色甚至更复杂的画笔。

在XAML中,需要引用转换器的命名空间。就我而言,它只是WpfApplication2与XAML命名空间名称c

相关联
<Window 
    [... other properties]
    xmlns:c="clr-namespace:WpfApplication2">

现在,绑定到foreground属性时,请使用转换器

<TextBlock Text="{Binding Status}" Foreground="{Binding StatusMessage,Converter={c:StatusMessageToColorConverter}}" />

这应该可以解决问题。

现在关于动态更改值的另一部分。您的viewmodel类需要实现INotifyPropertyChanged并在值发生更改时引发PropertyChanged事件。例如,请参阅以下类,该类仅包含示例的两个属性和必要的通知逻辑。

public class ItemModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void NotifyPropertyChanged([CallerMemberName]string prop = null)
    {
        var tmp = PropertyChanged;
        if (tmp != null) tmp(this, new PropertyChangedEventArgs(prop));
    }

    private string _Status;
    public string Status
    {
        get { return _Status; }
        set { _Status = value; NotifyPropertyChanged(); }
    }
    private StatusMessage _StatusMessage;
    public StatusMessage StatusMessage
    {
        get { return _StatusMessage; }
        set { _StatusMessage = value; NotifyPropertyChanged(); }
    }
}

更复杂的视图模型可以遵循相同的方法。为了减少更新开销,请比较当前值和setter中的新值,并仅在值实际更改时通知。

答案 1 :(得分:0)

在视图模型中,您可以添加一个名为GetColour的属性,该属性查看当前的枚举值并返回颜色。然后只需绑定xaml中的GetColour属性。