是否有一种干净的方法来处理WPF应用程序中的单位(度,弧度等)转换

时间:2013-09-11 00:45:48

标签: c# wpf caliburn.micro

我正在开发一个映射应用程序的插件,该应用程序有很多类,有很多单元选项。我觉得我在维护模型中的顺序方面有很好的处理。例如,Angle类具有Degrees和Radians的属性,并自动相互更新。 Altitude类对于脚MSL,米MSL,米HAE等执行相同的操作。

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

在值及其单位之间实现清晰映射以实现合成的任何想法?

1 个答案:

答案 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的关注点,但我不打算改变你的观点,以适应你何时可以非常有效地完成它而不用