6

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

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

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

4

2 回答 2

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);
于 2012-02-23T23:50:03.057 回答
2

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

当然,这可能无济于事——如果您想避免添加属性,您可能还想避免实现相当复杂的接口。显而易见的解决方案是编写一个类型,其工作是充当数据源并绑定到该数据源,而不是您当前绑定的任何对象。

当然,如果您这样做那么实现您将在该包装器上实现的任何属性可能会更容易。

通常,对于数据绑定,您希望避免直接绑定到某些底层模型,这正是因为您不希望纯粹为了 UI 的利益而将内容添加到模型中。这就是为什么“分离展示”非常流行的原因——不是直接连接模型和视图,而是在中间插入一些东西,它的工作是调解。有人称其为视图模型,有人称其为演示者,但基本原则始终是演示分离。

听起来您正在尝试实现分离的表示(这很好),但没有引入额外的类型,以便这个中间层有地方可去。为什么不直接定义一个类(或一组类)来充当该层?

于 2012-02-23T16:01:03.133 回答