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

时间:2012-02-23 15:40:40

标签: winforms data-binding databinder

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

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

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

2 个答案:

答案 0 :(得分:4)

是的,您可以使用Binding类的Format事件来执行此操作。您仍将绑定到相关属性,但您的Format事件处理程序将返回不同的值(在这种情况下为bool)。

var binding = new Binding("Visible", model, "Name");
binding.Format += (sender, args) => args.Value = (string)args.Value != "Default";
label.DataBindings.Add(binding);

答案 1 :(得分:2)

Windows窗体数据绑定识别ICustomTypeDescriptor接口,该接口允许对象在运行时决定它为数据绑定提供哪些属性。因此,如果你编写了一个实现,你可以告诉Windows Forms你有什么属性,你可以决定如何实现它们。

当然,这可能没有帮助 - 如果您想避免添加属性,您可能还想避免实现相当复杂的界面。显而易见的解决方案是编写一个类型,其作用是充当数据源并绑定到该类型而不是您当前绑定的任何对象。

当然,如果你 那么它可能更容易实现你将要在该包装器上实现的任何属性。

通常使用数据绑定,您希望避免直接绑定到某些底层模型,正是因为您不希望仅为了UI的利益而向模型添加内容。这就是“分离演示”非常受欢迎的原因 - 您不必直接连接模型和视图,而是在中间工作以调解。有人将此称为视图模型,有些人将其称为演示者,但基本原则始终是表示的分离。

听起来你正试图实现单独的呈现(这是好的),但没有引入额外的类型,以便这个中间层有一个地方去。为什么不定义一个类(或一组类)来充当该层?