我之前的回答(现已删除)不正确的是:这个can完成,使用自定义TypeConverter.
First,人们需要一个合适的转换器。 (与 XAML 不同,不实现IValueConverter,但派生自TypeConverter。) 例如:
// using System;
// using System.ComponentModel;
// using System.Drawing;
// using System.Globalization;
sealed class BooleanToColorConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context,
Type destinationType)
{
return destinationType == typeof(Color);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType)
{
return (bool)value ? Color.Green : Color.Red;
}
}
Next,(也与 XAML 数据绑定不同)此转换器不适用于绑定itself;它必须使用以下方法附加到数据源的属性[TypeConverter]属性:
// using System.ComponentModel;
partial class DataSource : INotifyPropertyChanged
{
[TypeConverter(typeof(BooleanToColorConverter))] // <-- add this!
public bool IsValid { get { … } set { … } }
}
Finally, 格式化必须在数据绑定上启用:
// Control control = …;
// DataSource dataSource = …;
control.DataBindings.Add("ForeColor", dataSource, "IsValid", formattingEnabled: true);
// ^^^^^^^^^^^^^^^^^^^^^^^
请注意,此示例仅处理单向(数据源到控件)数据绑定。对于双向数据绑定,您还必须覆盖TypeConverter.ConvertFrom
and TypeConverter.CanConvertFrom
方法。