这是我的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
仍未改变。
答案 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属性。