很多时候多个控件状态依赖同一个属性,比如使用一个 Label 显示电压,另一个Label根据电压显示“低电/充足”,当然,你可以再定义一个 string 类型的属性,float 类型的电压变更的时候也更新一下这个 string 类型的属性,当这样的情况比较多的时候,就需要多定义很多属性(仅仅是为了给UI控件用),需求变更的时候也容易漏改,所以最好保持尽量少的数据源,这样的话就需要转换类型以适应控件属性,下面是转换的代码
public static void MapBinding<TValue, TResult>(this Control control,
string propertyName, object dataSource, string dataMember,
Func<TValue, TResult> mapper)
{
var binding = new Binding(propertyName, dataSource, dataMember);
binding.Format += (sender, args) =>
{
if (args.Value is TValue value)
{
args.Value = mapper(value);
}
};
control.DataBindings.Add(binding);
}
//使用
//label2.MapBinding<float, string>("Text", ViewModel, nameof(ViewModel.Voltage), v => v< 2.6f ? "低电" : "充足");