繁体   English   中英

如何以用户选择的单位显示温度

[英]How to display temperature in user chosen units

我有一个 WPF 应用程序,可以在模型中以摄氏温度保存用户定义的温度值。 这些是在带有数字掩码的文本框中输入的,这些掩码绑定到 VM 上的整数属性。

我想让用户能够输入摄氏或华氏温度。 这是由一个简单的用户设置控制的。 因此,该值也必须以正确的单位显示在文本框中。

我试过使用转换器,但没有取得太大的成功。 我可以让转换器工作,但不是我想要的。

当 UserControl 加载时,值可能需要从摄氏度转换为华氏度。 我能够使用此转换器使其正常工作:

    public class CelciusToFahrenheit : IValueConverter
    {
        /// <summary>
        /// Converts from Celsius to Fahrenheit if required by user settings
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double returnValue = System.Convert.ToInt32(value);

            if (Settings.Default.FahrenheitFlag)
            {
                returnValue = (returnValue * 1.8) + 32;
            }

            return Math.Floor(returnValue);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int returnValue = System.Convert.ToInt32(value);

            if (Settings.Default.FahrenheitFlag)
            {
                returnValue = System.Convert.ToInt32((returnValue - 32) / 1.8);
            }

            return returnValue;
        }
    }

这里的问题是,当用户输入值时,这也会转换值。这意味着如果您尝试输入 66,由于舍入错误,最终会得到 77。

以前有人这样做过吗? 我敢肯定这是可能的,但我一直在反对这个问题有一段时间了。

我会在可以绑定到两个文本框的视图模型中进行计算。 一个是摄氏度,一个是华氏度。 如果用户在摄氏度文本框中输入文本,则计算华氏度值并将其插入到华氏度文本框中,反之亦然。 无需为此更改设置。

public class TemperatureViewModel: INotifyPropertyChanged
{
    private double _celsius;
    public double Celsius
    {
        get { return _celsius; }
        set {
            if (value != _celsius) {
                _celsius = value;
                _fahrenheit = Math.Round(1.8 * value + 32.0, 2);
                OnPropertyChanged(nameof(Celsius));
                OnPropertyChanged(nameof(Fahrenheit));
            }
        }
    }

    private double _fahrenheit = 32.0;
    public double Fahrenheit
    {
        get { return _fahrenheit; }
        set {
            if (value != _fahrenheit) {
                _fahrenheit = value;
                _celsius = Math.Round((value - 32.0) / 1.8, 2);
                OnPropertyChanged(nameof(Fahrenheit));
                OnPropertyChanged(nameof(Celsius));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

请注意,VM 实现INotifyPropertyChanged以在值更改时通知 UI。 效果是文本框自动刷新。 另请注意,属性设置器将计算出的值分配给支持字段,而不是属性,以避免这两个属性在恶性循环中相互更新。

我的实现将计算出的温度四舍五入到 2 个小数位。 但你当然可以改变这一点。

我不相信这是您应该进行转换的地方。 您的模型具有温度属性,正如您所说,它始终存储为摄氏度。 这就是它应该保持的方式。

这里不需要值转换器,但可能希望将此计算移动到您的 ViewModel 中,并让getset属性根据用户设置确定必须发生的转换,并同时避免使用值转换器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM