我目前正在为Windows Phone构建一个测量单位转换应用程序。设置我的用户界面后,我将数据绑定添加到两个文本框中,每个文本框都显示一个测量值。 (例如,华氏温度)
到目前为止,这么好。但是,当我部署我的应用程序时,我遇到了循环依赖。每当我更新一个值时,都会调用转换函数,而另一个单元则会更新。因此,它的值被设置,导致转换函数再次运行。
我可以做些什么来避免这种依赖?我想这更像是一个概念性的东西,而不是实际的编程。感谢
示例代码
private float _fahrenheit;
private float _celsius;
public float Fahrenheit {
get { return _fahrenheit; }
set {
_fahrenheit = value;
FahrenheitToCelsius();
}
}
public float Celsius
{
get { return _celsius; }
set
{
_celsius = value;
CelsiusToFahrenheit();
}
}
private void CelsiusToFahrenheit()
{
Fahrenheit = _celsius * 1.8f + 32.0f;
}
private void FahrenheitToCelsius()
{
Celsius = ((_fahrenheit - 32.0f) * 5.0f) / 9.0f;
}
答案 0 :(得分:1)
不要在两种方法中使用setter,而是将值直接写入实例字段。它实际上更像是一种编程而非概念性的东西。
答案 1 :(得分:1)
我会选择其中一个作为你的基地。另一个将永远是这个的转换。我们使用公制转换为我们的应用程序的英制转换。所有值都以度量标准存储,但您可以显示公制或英制。如果您打算使用Celsius作为基础,它将看起来像这样:
private float _celsius;
public float Fahrenheit {
get { return _celsius * 1.8f + 32.0f }
set
{
float cels = (((value - 32.0f) * 5.0f) / 9.0f);
if (cels != _celsius)
{
_celsius = cels;
TempPropertiesChanged();
}
}
}
public float Celsius
{
get { return _celsius; }
set
{
if (value != _celsius)
{
_celsius = value;
TempPropertiesChanged();
}
}
}
private void TempPropertiesChanged()
{
OnPropertyChanged("Fahrenheit");
OnPropertyChanged("Celsius");
}