使用带有绑定源的自定义格式?

时间:2016-06-09 18:15:04

标签: c# winforms data-binding

我有很多类都有一个字符串属性来保存IBAN

出于显示目的,我想在每4个字符后显示一个空格的值,例如:

'GB29 NWBK 6016 1331 9268 19'

是否可以编写一个实现ICustomFormatter的类,然后为文本框数据绑定指定这种新的自定义格式?

或者处理BindingComplete的{​​{1}}事件会更好吗?

1 个答案:

答案 0 :(得分:1)

一般方法是将自定义TypeConverter与该类型的类属性相关联。

例如:

<强>格式化:

public static class IBAN
{
    public static string Format(string value)
    {
        if (string.IsNullOrEmpty(value)) return value;
        var sb = new StringBuilder();
        for (int i = 0; i < value.Length; i++)
            (i != 0 && (i % 4) == 0 ? sb.Append(' ') : sb).Append(value[i]);
        return sb.ToString();
    }
}

<强>转换器:

public class IBANTypeConverter : TypeConverter
{
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
            return IBAN.Format(value as string);
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

包含属性的示例数据类:

public class MyObject
{
    [TypeConverter(typeof(IBANTypeConverter))]
    public string IBAN { get; set; }
}

示例数据绑定:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var data = new MyObject { IBAN = "GB29NWBK60161331926819" };
        var form = new Form();
        var tbIBAN = new TextBox { Parent = form, Left = 8, Top = 8, Width = form.ClientSize.Width - 16, Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right };
        tbIBAN.DataBindings.Add("Text", data, "IBAN", true);
        Application.Run(form);
    }
}

enter image description here