我有一个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。
有人做过吗? 我敢肯定这是有可能的,但是我已经为此努力了一段时间。
答案 0 :(得分:1)
我将在可以绑定到两个文本框的视图模型中进行计算。摄氏一度,华氏度一度。如果用户在“摄氏温度”文本框中输入文本,则将计算华氏温度值并将其插入到“华氏温度”文本框中,反之亦然。无需为此更改设置。
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个小数位。但是您当然可以更改。
答案 1 :(得分:0)
我不认为这是您应该进行转换的地方。您的模型具有温度属性,正如您所说,该属性始终存储为摄氏温度。这就是它应该保留的方式。
这里不需要值转换器,但可能希望将此计算移到ViewModel中,并让get
和set
属性根据用户设置确定必须进行的转换,并一起避免使用价值转换器。