.net WinForms数据绑定使用Lambda而不是属性

.net WinForms数据绑定使用Lambda而不是属性,winforms,data-binding,databinder,Winforms,Data Binding,Databinder,在我的项目中,我有一个模型,我想使用模型属性之一绑定标签的可见状态。我不想向模型中添加其他ShowLabel属性。我希望能够写出这样的东西: label.Bindings.Add("Visible", model, m => m.Name != "Default"); 基本上,我希望能够编写lambda表达式,而不是向模型中添加属性。这可能吗?Windows窗体数据绑定识别ICustomTypeDescriptor接口,该接口允许对象在运行时决定向数据绑定显示哪些属性。因此,如果您编写了

在我的项目中,我有一个模型,我想使用模型属性之一绑定标签的可见状态。我不想向模型中添加其他ShowLabel属性。我希望能够写出这样的东西:

label.Bindings.Add("Visible", model, m => m.Name != "Default");

基本上,我希望能够编写lambda表达式,而不是向模型中添加属性。这可能吗?

Windows窗体数据绑定识别
ICustomTypeDescriptor
接口,该接口允许对象在运行时决定向数据绑定显示哪些属性。因此,如果您编写了它的一个实现,您可以告诉Windows窗体您有自己想要的任何属性,并且您可以决定如何实现它们

当然,这可能没有帮助——如果您希望避免添加属性,那么您也可能希望避免实现相当复杂的接口。显而易见的解决方案是编写一个类型,其任务是充当数据源并绑定到该类型,而不是当前绑定到的对象

当然,如果这样做的话,只需在包装器上实现要实现的任何属性都可能更容易

一般来说,使用数据绑定时,您希望避免直接绑定到某个底层模型,这正是因为您不希望纯粹为了UI的好处而向模型中添加内容。这就是为什么“分离演示”非常流行——而不是直接连接模型和视图,而是在中间的东西,它的任务是调解。有人称之为viewmodel,有人称之为presenter,但基本原则始终是表示分离


这听起来像是在尝试实现单独的表示(这很好),但没有引入额外的类型,这样中间层就有了出路。为什么不定义一个类(或一组类)作为该层呢?

是的,您可以使用绑定类的事件来实现这一点。您仍将绑定到有问题的属性,但格式事件处理程序将返回不同的值(本例中为bool)


工作完美。我曾考虑编写一个小型库来实现这一点,但我只需要将这些代码放入一个方法中。谢谢
var binding = new Binding("Visible", model, "Name");
binding.Format += (sender, args) => args.Value = (string)args.Value != "Default";
label.DataBindings.Add(binding);