测量单位转换+数据绑定

时间:2012-06-16 22:49:58

标签: c# xaml c#-4.0 data-binding

我目前正在为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;
    }

2 个答案:

答案 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");
}