簡體   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