【问题标题】:WPF simple property vs. complex propertyWPF 简单属性与复杂属性
【发布时间】:2011-03-16 21:09:38
【问题描述】:

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

【问题讨论】:

    标签: .net wpf performance properties converter


    【解决方案1】:

    使用转换器对性能的影响可以忽略不计。但是,您应该根据什么来选择该属性。

    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 特定的逻辑,那么您的封装是错误的 - 但以这种方式分离关注点有时是最难做到的事情之一。

    在性能方面,您会发现差别不大。 :-)

    【讨论】:

    • 好的,非常感谢,但你能告诉我为什么你说“使用布尔值和转换器更有意义”
    • 已经添加了一个相当冗长的示例,希望能解释 :-) 当我说“它更有意义”时,我的意思是要制作一个良好的可重用架构,并在类/层之间适当分离关注点.
    • 现在很简单了!非常感谢!
    【解决方案2】:

    如果问题是关于性能的,第一个选项的速度比第二个选项的速度可以忽略不计,因为后者涉及装箱/拆箱。

    但建议使用“面向数据”属性并相应地使用convertersDataTriggers 更改视图。

    【讨论】:

      【解决方案3】:

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

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

      如果我们使用Visibility 属性,那么它将显示为具有可见、隐藏和折叠选项的组合框。这可能会让非技术用户感到困惑。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 2011-11-29
        相关资源
        最近更新 更多