【问题标题】:Binding to a quantity and a measurement unit绑定到数量和测量单位
【发布时间】:2013-08-01 02:20:38
【问题描述】:

我是 WPF 开发的新手,我正在寻找有关我的应用程序中的循环数据绑定模式的建议。

在我正在使用的数据库中,大量使用了测量单位和相关值。

为了演示,这里有一些精简的表结构,可能会为我必须处理的内容提供一些线索:

样本表

  • (...)
  • 数量
  • MeasurementUnitId
  • (...)

SampleTable2

  • (...)
  • 速度
  • DistanceMeasurementUnitId
  • TimeMeasurementUnitId
  • (...)

SampleTable3

  • (...)
  • 距离
  • MeasurementUnitId
  • (...)

SampleTableN(等...)

  • (...)
  • 重量
  • WeightMeasurementUnitId
  • 音量
  • VolumeMeasurementUnitId
  • (...)

测量单位

  • 身份证
  • MeasurementUnitTypeId
  • 短名称
  • 转化系数
  • (...)

MeasurementUnitTypes

  • 身份证
  • 短名称
  • (...)

我希望这些名字不言自明。 :)

根据系统的工作方式,存储的值必须全部采用默认系统单位。用户在 UI 中写入 10 米不会将值存储为 10,它会转换为之前的系统值。例如,对于距离值,如果距离单位类型的默认测量单位是厘米,则存储的值实际上是 1000,因为 1000 厘米 = 10 米。

但是,用户使用的测量单位仍存储在数据库中。这是为了确保下次他再次在 UI 中打开记录时,他实际上看到的是 10 米,而不是 1000 厘米。当然也必须在那里进行转换。

每个单位测量类型有一个系统单位。它是将 ConversionFactor 设置为 1 的那个。其他测量单位有一个与此相关的 ConversionFactor。收回上面的距离示例:

  • 厘米:1
  • 男:100
  • 公里:100 000
  • (等)

在 UI 中,我想使用一个文本框来编写数字,并使用一个组合框来加载根据上下文过滤的单位类型的测量单位。当用户加载数据时,它必须显示为输入(根据相关的测量单位转换)。当他键入值时,绑定机制必须根据当前选择的度量单位的 ConversionFactor 将正确的转换后的值写回实体类中。

当他选择测量单位时,根据他的个人设置,可能会发生两种情况:

  • 显示的号码发生变化,而存储的号码保持不变
  • 显示的号码保持不变,存储的号码被转换

现在我的问题是……我可以封装多少这种功能以便于重用?最好的方法是什么?

请注意,有时我可能需要单独显示这些字段。例如,在网格中,我想要一个用于数字部分和单位部分的列。这是为了允许单独对单元进行过滤和排序。

我不介意每次都必须重新创建单元列表/组合/任何控件。我主要对重用单位转换部分感兴趣。

感谢您阅读本文(哇!)以及您能想到的任何想法。 :)

【问题讨论】:

    标签: .net wpf data-binding


    【解决方案1】:

    如果您是 WPF 新手,首先应该学习Model-View-ViewModel 模式。

    如果您以这种方式构建应用程序,则可以创建一个通用 ViewModel 类型,用于所有单元列表/组合/任何控件,它封装了执行单元转换的逻辑。

    【讨论】:

    • 我确实学习了 MVVM,但我可能还有很多东西要学。我的问题更多关于 WPF 数据绑定细节。还是我做错了什么,MVVM 真的应该填补这里的漏洞?
    • VM 是您处理所有逻辑的地方(例如,单位转换、选择单位列表等),它基本上只是将相关数据呈现给要数据绑定的视图。因此,文本部分将仅绑定到数字属性(可能使用转换器从字符串转换为数字),指定的单位将绑定到另一个属性,并且可用单位的列表(即组合的 ItemsSource)将绑定到第三个属性。
    • 好的,但有时我也必须显示系统值。这对于库存计量单位很常见,人们希望同时查看多个盒子和多个产品。我希望对这些字段中的任何一个进行任何更改以使另一个做出反应,并且我需要经常为许多 ModelView 对象重复此模式。
    • 然后您可以将系统值公开为另一个属性。您可以通过在 ViewModel 中包含逻辑,然后为任何修改的属性引发属性更改事件,使它们导致对其他属性的更改。
    • 您可以通过将其作为派生视图模型的基类来使模式可重复。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2012-04-07
    • 2018-03-03
    • 2019-01-03
    相关资源
    最近更新 更多