1

現在、WindowsPhone用の測定単位変換アプリを作成しています。ユーザーインターフェイスを設定した後、2つのテキストボックスにデータバインディングを追加しました。各テキストボックスには測定値が表示されます。(例:華氏<->摂氏)

ここまでは順調ですね。ただし、アプリをデプロイすると、循環依存に遭遇します。一方の値を更新するたびに、変換関数が呼び出され、もう一方の単位が更新されます。したがって、その値が設定され、変換関数が再度実行されます。

この依存関係を回避するにはどうすればよいですか?実際のプログラミングというよりは概念的なものだと思います。ありがとう

サンプルコード

    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;
    }
4

2 に答える 2

1

2つのメソッドでセッターを使用するのではなく、インスタンスフィールドに値を直接書き込みます。実際には、概念的なものというよりもプログラミング的なものです。

于 2012-06-16T22:55:36.120 に答える
1

そのうちの1つをベースとして選びます。もう1つは、常にこれを変換したものになります。これは、アプリのメートル法からインペリアル法への変換を使用して行います。すべての値はメートル法で保存されますが、メートル法またはインペリアルのいずれかを表示できます。摂氏をベースとして使用する場合は、次のようになります。

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");
}
于 2012-06-17T01:39:53.473 に答える