C# 测量单位转换+;数据绑定

C# 测量单位转换+;数据绑定,c#,xaml,c#-4.0,data-binding,C#,Xaml,C# 4.0,Data Binding,我目前正在为Windows Phone构建一个测量单位转换应用程序。在设置了我的用户界面之后,我向两个文本框添加了数据绑定,每个文本框显示一个度量值。(例如华氏摄氏度) 到目前为止,一切顺利。然而,当我部署我的应用程序时,我遇到了循环依赖。每当我更新一个值时,就会调用转换函数,并更新另一个单位。因此,它的值被设置,导致转换函数再次运行 我能做些什么来避免这种依赖性?我想这更多的是一个概念性的东西,而不是实际的编程。谢谢 示例代码 private float _fahrenheit;

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

不要在这两个方法中使用setter,而是将值直接写入实例字段。实际上,这更多的是一个编程问题,而不是一个概念问题。

我会选择其中一个作为您的基础。另一个将始终是此的转换。我们在应用程序中使用公制到英制的转换。所有值都存储在公制中,但您可以显示公制或英制。如果您打算使用摄氏度作为基准,它将如下所示:

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

您可以通过引用传递该值,因为每当它更新它时,它只会更新原始值。