【发布时间】:2011-03-16 21:09:38
【问题描述】:
在 WPF 中,最好创建一个“复杂”属性(即“可见性”类型)或简单属性(即布尔类型),然后使用转换器绑定该属性?第一种方式写的比较短,但是不知道性能有什么好。
【问题讨论】:
标签: .net wpf performance properties converter
在 WPF 中,最好创建一个“复杂”属性(即“可见性”类型)或简单属性(即布尔类型),然后使用转换器绑定该属性?第一种方式写的比较短,但是不知道性能有什么好。
【问题讨论】:
标签: .net wpf performance properties converter
使用转换器对性能的影响可以忽略不计。但是,您应该根据什么来选择该属性。
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 是一个“更高级别”的类 - 一个包装您的数据类并包含特定于 UI 的逻辑的类 - 因此包含特定于您的 UI 的代码更合适。理想情况下,您应该轮流学习项目的每个类,并确保它具有特定目的:如果Foo 是一个保存数据的业务对象,为什么它应该公开(甚至关心!)某些对象的可见性那块UI用来显示吗?如果将Foo 放在命令行应用程序或 Web 应用程序中会发生什么?如果您在业务类中有 WPF-UI 特定的逻辑,那么您的封装是错误的 - 但以这种方式分离关注点有时是最难做到的事情之一。
在性能方面,您会发现差别不大。 :-)
【讨论】:
如果问题是关于性能的,第一个选项的速度比第二个选项的速度可以忽略不计,因为后者涉及装箱/拆箱。
但建议使用“面向数据”属性并相应地使用converters 或DataTriggers 更改视图。
【讨论】:
我认为这两个选项中的任何一个都不会产生重大的性能问题。 更重要的是谁将成为物业的最终用户。
在我的项目中,我们在属性网格中向用户显示这些类型的属性;因此拥有一个布尔属性更有意义,以便将其作为复选框显示给用户。
如果我们使用Visibility 属性,那么它将显示为具有可见、隐藏和折叠选项的组合框。这可能会让非技术用户感到困惑。
正如 Dan 所说 - 如果您的属性是在视图模型/表示层中声明的,并且只有您会在视图(xaml 或代码)中使用此属性,那么拥有复杂属性更有意义。这样您就可以直接绑定它。但如果你在其他地方做,说你的 BL,那么把它写成bool 会更有意义。
【讨论】: