Мой предыдущий ответ (теперь удаленный) был неверным: это можно сделать, используя пользовательский TypeConverter
.
Во-первых, нужен подходящий конвертер. (В отличие от 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;
}
}
Далее (а также в отличие от привязки данных XAML) этот преобразователь не применяется к самой привязке ; он должен быть присоединен к свойству источника данных с помощью атрибута [TypeConverter]
:
// using System.ComponentModel;
partial class DataSource : INotifyPropertyChanged
{
[TypeConverter(typeof(BooleanToColorConverter))] // <-- add this!
public bool IsValid { get { … } set { … } }
}
Наконец, , форматирование должно быть включено для привязки данных:
// Control control = …;
// DataSource dataSource = …;
control.DataBindings.Add("ForeColor", dataSource, "IsValid", formattingEnabled: true);
// ^^^^^^^^^^^^^^^^^^^^^^^
Обратите внимание, что в этом примере рассматривается только односторонняя (источник данных для управления) привязка данных. Для двухсторонней привязки данных вам также необходимо переопределить методы TypeConverter.ConvertFrom
и TypeConverter.CanConvertFrom
.