我正在开发一个 map 应用程序的插件,它有很多类,有大量的单位选项。我觉得我在维护模型内的顺序方面有很好的处理能力。例如,Angle 类具有 Degrees 和 Radians 的属性并自动相互更新。 Altitude 类对英尺 MSL、米 MSL、米 HAE 等执行相同的操作。
但是,当我进入 WPF 端时,我希望任何数据输入点都有一个 TextBox,以便它们可以输入值但也可以显示单位。我目前正在使用 Caliburn Micro 来使用组合,它对我来说完全改变了游戏规则。在过去,我会把某种枚举组合在一起并将它们映射到每个单独的 View 模型,这可能会导致大量代码重复,并且肯定会使代码变得脆弱。我不想在模型中使用某种 SelectedUnit 功能,因为我觉得单位的字符串表示仅对 View 有值(value)。
有什么想法可以实现值与其单位之间的清晰映射,从而允许组合?
最佳答案
我不确定我是否完全理解 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); } }
}
那么绑定(bind)就变得简单了:
<TextBox Text="{Binding Quantity, Mode=TwoWay}" /><TextBlock Text="{Binding UnitOfMeasure.Name}" />
您的 View 不需要更改以显示新的度量单位,您只需将新的 UOM 分配给 UnitOfMeasure
属性,以及对 Quantity
的任何后续调用返回新的转换率。
显然我遗漏了一些通知代码,但您可以填写
这是否使事情变得更容易,或者您是否已经考虑过这一点?
我知道您不想用 UOM 字符串“污染”您的模型,但 UOM 确实是模型的一部分。如果不是,那至少是一个 ViewModel 问题,但我不会费心去改变你的观点以适应你可以在没有
关于c# - 是否有一种干净的方法来处理 WPF 应用程序中的单位(度数、弧度等)转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18730984/