2010-07-16 137 views
0

在WPF中,最好创建一个属性“复杂”(即类型为“可见性”)或属性简单(即类型为布尔型),然后使用转换器绑定属性?第一种方法写得较短,但我不知道什么是更好的表现。WPF简单属性与复杂属性

+0

请举一个例子 – Ozan 2010-07-16 10:18:50

回答

6

使用转换器的性能受到的影响可以忽略不计。但是,您应该根据自己的选择确定实施该属性的位置。

A Visibility属性只对UI层(自定义控件或可能是视图模型)中的类有意义。如果你在模型类上创建一个属性,刚刚发生驱动你的用户界面在这种情况下,使用布尔和转换器会更有意义。

编辑:加入(略做作)例如

例如,假设你有称为Foo可编辑对象数据类(模型),和一个Foo可以是“简单的”或“先进。 “ “高级”Foo将在UI中显示额外的编辑控件 - 因此我们需要将高级编辑面板的Visibility属性绑定到某个属性。

您的Foo类可能有一个属性来指示它是否先进。该属性应该肯定是一个布尔值 - 不是Visibility - 因为你的Foo类不应该关心显示它的UI的任何细节。所以布尔型Foo.IsAdvanced将是一个合适的属性。

在这种情况下,您可以直接绑定到Foo.IsAdvanced并使用转换器。你明确不要想做的是创建一个Visibility属性Foo.AdvancedEditControlVisibility,因为Foo应该是后端数据类。

如果你想创建一个不需要转换器的属性,你应该创建一个属性在一个更高的类中,一个属于你的UI。有些体系结构模式会将其称为“ViewModel”类 - 它是一种以数据更适合UI显示的方式呈现模型的类。因此,您可以创建一个需要Foo的类,并根据的Foo.IsAdvanced的值显示AdvancedEditControlVisibility属性

在这种情况下,您可以直接绑定到视图模型上的属性,无需转换器。请注意,最终你已经完成了转换 - 你只是将它作为代码的一个更明确的部分,而不是局限于标记。

这里的思考过程是viewmodel是一个“更高级别”的类 - 一个包装你的数据类,包括UI特定的逻辑 - 所以更适合包含特定于你的UI的代码。理想情况下,您应该轮流进行每个类的项目并确保其具有特定目的:如果Foo是一个用于存储数据的业务对象,为什么它应该公开(甚至关心!)某些项目的可见性UI用来显示它?如果您将Foo放入命令行应用程序或Web应用程序中,会发生什么情况?如果您在业务类中使用了WPF-UI特定的逻辑,那么您的封装是错误的 - 但以这种方式分离问题是有时需要解决的最困难的事情之一。

性能方面你会发现几乎没有区别。:-)

+0

好的,非常感谢,但你能告诉我为什么你说“它会更有意义的使用布尔和转换器” – lamarmora 2010-07-16 10:40:36

+0

已经添加了一个相当冗长的例子,希望解释: - )当我说“它更有意义”时,我的意思是通过在类/层之间适当分离关注点来制作好的可重用架构。 – 2010-07-16 12:17:31

+0

雅确实很长:) – akjoshi 2010-07-16 12:27:46

2

如果问题是关于性能的话,那么第一个选项在第二个选项中的速度可以忽略不计,因为后者涉及装箱/取消装箱。

但是,建议您使用convertersDataTriggers来确定属性Data-Oriented并相应地更改视图。

1

我不认为这两个选项中的任何一个都会有主要的性能问题。 更重要的是谁将是该物业的最终用户。

在我的项目中,我们在属性网格中向用户显示这些类型的属性;因此具有布尔属性更有意义,因此它显示为用户的复选框。

如果我们使用Visibility属性,那么它将显示为具有可见,隐藏和折叠选项的组合框。这可能会让非技术用户感到困惑。如丹说的 - 如果你的属性是在viewmodel /表示层中声明的,只有你将在视图(xaml或代码)中使用这个属性,那么拥有复杂属性更有意义。所以你可以直接绑定。但如果你正在做其他地方说你的BL,那么把它作为bool更有意义。