为了绑定可以打破LSP吗?

时间:2011-10-07 10:08:44

标签: design-patterns data-binding silverlight-4.0 mvvm liskov-substitution-principle

某事告诉我,我可能会因为问这个问题而被私刑。对于提前长篇大论的描述感到抱歉。

我正在研究Silverlight 4项目中的一个角落案例。基本上我正在构建的是一个自定义表单构建器。

表单可能包含多个不同类型的字段(文本,整数,电子邮件等...)。现在,所有这些类型都扩展了Field类,但在文本字段的情况下可能还有其他属性,如length。

我可以在FieldViewModels中添加和删除FormFieldsManagementViewModel集合中的字段。所以到目前为止它都是非常标准的东西。

现在,...为了让用户针对Field对象设置属性,我有一个UserControl,它具有DataTemplate类型的依赖属性,并且代表我想要在选择特定类型的字段。因此,为了澄清,UserControl有一个SingleLineTextTemplate属性,当选择SingleLineTextFieldViewModel时会显示但是当EmailFieldViewModel被选中时,EmailFieldTemplate是所示。 SingleLineTextFieldViewModelEmailFieldViewModel都继承自FieldViewModel

当我在每个模板中声明绑定时,我的问题就出现了。设置基类FieldViewModel的属性非常有效(恕我直言),例如IsRequiredPosition,但我也在Length中匹配SingleLineTextTemplate的绑定SingleLineTextFieldViewModel的Length属性。所以我依赖于具体类的扩展接口,而不仅仅是FieldViewModel类。

我应该指出,在我继续这项工作之前。我不确定会不会,现在确实如此,我不确定它应该......或者我甚至应该这样做。

我只是为了绑定而没有绑定到动态对象和/或Silverlight中缺少DataTemplateSelector而这样做。

显然,SingleLineTextFieldViewModel 在绑定方案中不能替代它的基类。我的问题是,因为我并没有真正在代码中使用这些对象,而是在标记中,...这仍然被认为是不好的做法吗?

提前多多感谢。

1 个答案:

答案 0 :(得分:1)

我对此没有任何问题 - 我过去做过相同或类似的事情。

假设当SingleLineTextTemplateDataContext的实例(可能是通过将SingleLineTextFieldViewModel映射到该类型)时,您只使用DataTemplate,那么从来没有任何问题,并且由于绑定框架的弹性,即使您尝试将模板用于不合适的类型,也不会产生任何明显的负面影响。