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

标签 c# wpf caliburn.micro

我正在开发一个 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/

相关文章:

c# - 接口(interface)实现在函数中有一个额外的参数

c# - 如何在静态属性中使用NotifyOfPropertyChange(Caliburn Micro)

c# - 带空值的 LINQ Max()

c# - Unity 4.2 Android 应用内计费 : Signature verification failed

c# - 我如何知道 ComboBox 中的值何时为 "re-selected"?

c# - Caliburn.micro View ViewModel 名称解析问题

wpf - 如何在 Caliburn.Micro 中绑定(bind)按键手势?

c# - SQLite 数据库锁定异常

c# - WPF View 在关闭时将 ViewModel 属性设置为 null

wpf - 在 Visual Studio 2008 XAML 设计器中引用嵌套类型