WPF简单属性与复杂属性

时间:2010-07-16 10:12:58

标签: .net wpf performance properties converter

3 个答案:

答案 0 :(得分:6)

使用转换器的性能损失可以忽略不计。但是,你应该选择的是你正在实施财产的地方。

Visibility属性仅对UI层中的类(自定义控件或视图模型)有意义。如果您正在模型类上创建一个刚刚发生的属性来驱动您的UI,那么使用布尔值和转换器会更有意义。

编辑:添加(稍加设计)示例

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

您的Foo课程可能有一个属性来表明它是否已提升。该属性绝对应该是一个布尔值 - 不是Visibility - 因为你的Foo类不应该关心显示它的UI的任何细节。所以布尔值Foo.IsAdvanced将是一个合适的属性。

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

如果您想创建一个不需要转换器的属性,您应该在更高级别创建该属性,特定于您的UI。一些架构模式将其称为“ViewModel”类 - 它是一个以更适合UI显示的方式呈现模型的类。因此,您可以创建一个采用Foo的类,并基于其AdvancedEditControlVisibility的值公开Foo.IsAdvanced属性。

在这种情况下,您可以直接绑定到viewmodel上的属性而不使用转换器。请注意,最终您已经完成了转换 - 您只是将其作为代码中更明确的部分,而不是局限于标记。

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

在性能方面,你会注意到差别不大。 : - )

答案 1 :(得分:2)

答案 2 :(得分:1)

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

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

如果我们使用Visibility属性,那么它将显示为具有Visible,Hidden和Collapsed选项的组合框。这可能会使非技术用户感到困惑。

正如Dan所说 - 如果您的属性是在viewmodel / presentation层中声明的,并且只有您在视图(xaml或代码)中使用此属性,那么拥有复杂属性会更有意义。这样你就可以直接绑定它了。但是,如果你正在其他地方说你的BL,那么把它作为bool更有意义。