我正在开发一个映射应用程序的插件,该应用程序有很多类,有很多单元选项。我觉得我在维护模型中的顺序方面有很好的处理。例如,Angle类具有Degrees和Radians的属性,并自动相互更新。 Altitude类对于脚MSL,米MSL,米HAE等执行相同的操作。
但是,当我进入WPF端时,我希望任何数据入口点都有一个TextBox,这样他们就可以输入值,但也可以显示单位。我目前正在使用Caliburn Micro来使用合成,它对我来说已经彻底改变了游戏规则。在过去,我会将某种枚举整合到一起,并将它们映射到每个单独的视图模型,可能会有大量的代码重复,并且肯定会使代码变得脆弱。我不想在模型中使用某种SelectedUnit功能,因为我觉得单位的字符串表示只对视图有价值。
在值及其单位之间实现清晰映射以实现合成的任何想法?
答案 0 :(得分:1)
我不确定我是否完全理解C ++ lib的作用以及为什么需要将其包装起来,但是如果你在某处有一个基本测量单位,那么使用相对值转换为另一个UOM是非常简单的(汇率)
这样做意味着您的模型不需要更改,并且可以为转换后的值公开单个属性,为基础值公开单个属性。更改UOM会导致转换的UOM值发生变化
e.g。
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}" />
您的视图无需更改即可显示新的度量单位,只需将新UOM分配给UnitOfMeasure
属性,然后对Quantity
的任何后续调用都将返回新的转换率。
显然我省略了一些通知代码,但你可以填写
这会让事情变得更容易,还是你已经考虑过了?
我知道你不想用UOM字符串“污染”你的模型,但UOM确实是模型的一部分。如果不是,那至少是ViewModel的关注点,但我不打算改变你的观点,以适应你何时可以非常有效地完成它而不用