2

我正在开发一个映射应用程序的插件,该应用程序具有相当多的类,这些类具有大量的单位选项。我觉得我在维护模型中的顺序方面做得很好。例如,Angle 类具有 Degrees 和 Radians 的属性,并且会自动相互更新。Altitude 类对英尺 MSL、米 MSL、米 HAE 等执行相同的操作。

但是,当我进入 WPF 端时,我希望任何数据输入点都有一个 TextBox,以便它们可以输入值但也可以显示单位。我目前正在使用 Caliburn Micro 来使用构图,它对我来说彻底改变了游戏规则。过去,我会将某种枚举组合在一起并将它们映射到每个单独的视图模型,这可能会产生大量代码重复,并且肯定会使代码变得脆弱。我不想在模型中有某种 SelectedUnit 功能,因为我觉得单位的字符串表示只对视图有价值。

有什么想法可以在一个值和它的单位之间实现一个干净的映射,从而允许组合?

4

1 回答 1

1

我不确定我是否完全理解 C++ 库的作用以及为什么需要包装它,但如果你在某处有一个基本计量单位,那么使用相对值(汇率)转换为另一个 UOM 是非常简单的

这样做意味着您的模型不需要更改,并且可以为转换后的值公开一个属性,为基值公开一个属性。更改 UOM 会导致转换后的 UOM 值发生变化

例如

class SomeModel 
{ 
    // You can assume that the base UOM has a conversion rate of 1
    UnitOfMeasure BaseUnitOfMeasure { get; }

    decimal BaseQuantity { get; }

    UnitOfMeasure UnitOfMeasure { get; set; }

    decimal Quantity { get { return UnitOfMeasure.Convert(BaseQuantity, BaseUnitOfMeasure); } }

   // or if you are assuming base UOM is conversion rate of 1 then you can just use
   // decimal Quantity { get { return UnitOfMeasure.Convert(BaseQuantity); } }
}

那么绑定就变得简单了:

<TextBox Text="{Binding Quantity, Mode=TwoWay}" /><TextBlock Text="{Binding UnitOfMeasure.Name}" />

您的视图无需更改即可显示新的计量单位,您只需为UnitOfMeasure属性分配一个新的 UOM,然后任何后续调用即可Quantity返回新的转换汇率。

显然我遗漏了一些通知代码,但你可以填写

这会使事情变得更容易还是您已经考虑过这一点?

我知道您不想用 UOM 字符串“污染”您的模型,但 UOM 确实是模型的一部分。如果不是,它至少是一个 ViewModel 问题,但我不会费心改变你的视图以适应你可以在没有的情况下非常有效地做到这一点

于 2013-09-11T13:33:54.057 回答