Winforms数据绑定:可以使用TypeConverter而不是Format / Parse事件吗?

时间:2010-08-07 11:22:06

标签: c# .net winforms data-binding typeconverter

在Winforms表单中,我想在输入字段包含无效值时向用户提供可视提示。为此,我想将输入字段标签的ForeColor属性绑定到基础模型的(布尔)IsPropertyValid属性,以便在IsPropertyValid == false时标签变为红色。

我目前拥有的是绑定的Format事件的事件处理程序:

Controls["dateOfBirthLabel"].DataBindings["ForeColor"].Format += convertBoolToColor;
// (dateOfBirthLabel.ForeColor is bound to a boolean IsDateOfBirthValid property.)

void convertBoolToColor(object sender, ConvertEventArgs e)
{
    e.Value = (bool)e.Value ? Color.Black : Color.Red;
}

如果我想在WPF中执行此操作,我想我会直接使用XAML中的绑定指定自定义value converterboolColor)。 最重要的是,我不必通过其名称引用特定控件。

我想用Winforms表单做同样的事情。理想情况下,我可以直接在Forms Designer中为特定绑定指定TypeConverter对象。这可能吗?

2 个答案:

答案 0 :(得分:5)

My previous answer (now deleted)不正确:可以使用自定义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] attribute

将其附加到数据源的属性
// using System.ComponentModel;

partial class DataSource : INotifyPropertyChanged
{
    [TypeConverter(typeof(BooleanToColorConverter))] // <-- add this! 
    public bool IsValid { get { … } set { … } }
}

最后,必须在数据绑定上启用formatting

// Control control = …;
// DataSource dataSource = …;

control.DataBindings.Add("ForeColor", dataSource, "IsValid", formattingEnabled: true);
//                                                           ^^^^^^^^^^^^^^^^^^^^^^^

请注意,此示例仅处理单向(数据源控制)数据绑定。对于双向数据绑定,您还必须覆盖TypeConverter.ConvertFromTypeConverter.CanConvertFrom方法。

答案 1 :(得分:-3)

c.DataBindings.Add("Checked", dataSource, dataMember, true, DataSourceUpdateMode.OnPropertyChanged );


class Someclass
{
[TypeConverter(typeof(IntBoolConverter))]
        public int p_isEnable
        {
            get { return nc_isEnable; }
            set { m_isEnable= value); }
        }
}
 public class IntBoolConverter:TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {

            if (sourceType == typeof(bool))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(int))
            {
                return true;
            }
            return base.CanConvertFrom(context, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is bool)
            {
                var objectToInt = value.ObjectToBool();
                return objectToInt;
            }
            return base.ConvertFrom(context, culture, value);
        }
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(bool))
            {
                return value.ObjectToBool();
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }