如何在Winforms中使用带数据绑定的ValueConverter

如何在Winforms中使用带数据绑定的ValueConverter,winforms,data-binding,Winforms,Data Binding,在WPF中,很容易使用ValueConverter来格式化值等(在我们的例子中,将一些数字转换为不同的单位,例如公里到英里) 我知道这可以在Winforms中完成,但我所有的Google搜索只会显示WPF和Silverlight的结果。如果您能够并且愿意使用自定义属性装饰数据源属性,您可以 否则,必须附加到对象的和事件。不幸的是,除了最简单的场景外,这消除了在绑定中使用设计器的可能性 例如,假设您希望将文本框绑定到表示公里的整数列,并且希望以英里为单位进行可视化表示: 在构造函数中: Bindi

在WPF中,很容易使用ValueConverter来格式化值等(在我们的例子中,将一些数字转换为不同的单位,例如公里到英里)

我知道这可以在Winforms中完成,但我所有的Google搜索只会显示WPF和Silverlight的结果。

如果您能够并且愿意使用自定义属性装饰数据源属性,您可以

否则,必须附加到对象的和事件。不幸的是,除了最简单的场景外,这消除了在绑定中使用设计器的可能性

例如,假设您希望将
文本框
绑定到表示公里的整数列,并且希望以英里为单位进行可视化表示:

在构造函数中:

Binding bind = new Binding("Text", source, "PropertyName");

bind.Format += bind_Format;
bind.Parse += bind_Parse;

textBox.DataBindings.Add(bind);


另一个选项是为表单提供一个特定的ViewModel,它以您需要在表单上显示的格式公开数据。通过使用和构建自己的应用程序,您可以轻松实现它


这样,您也将获得对designer的完全支持。

值得一提的是,此技术仅适用于使用和公开绑定对象的场景。它不适用于网格和其他复杂的绑定控件,当然,除非它们有自己的格式/解析API。因此,不幸的是,在WinForms数据绑定机制中确实没有使用值转换器的任何“通用”方法。相关:
void bind_Format(object sender, ConvertEventArgs e)
{
    int km = (int)e.Value;

    e.Value = ConvertKMToMiles(km).ToString();
}

void bind_Parse(object sender, ConvertEventArgs e)
{
    int miles = int.Parse((string)e.Value);

    e.Value = ConvertMilesToKM(miles);
}