1

私は依存関係プロパティ「Area」を次のように持っています:

public double Area
    {
        get { return Math.Round((double)this.GetValue(AreaProperty),2); } 
        set { this.SetValue(AreaProperty, value); }
    }

コードを使用していくつかのビジュアルを追加し、ビジュアルが追加されると領域を更新しています。値を小数点以下 2 桁に四捨五入したかったのです。

drawQuads(builder);  //Updating area in these three methods
extrudeQuads();
drawSidesAndBottoms(builder);

Area *= 1;  //this is required so that the roundoff method can work (Why ?)

ご覧のとおり、プロパティのゲッターは値を四捨五入しています。しかし、問題は、これら 3 つのメソッドを呼び出した後に「領域」に 1 などを掛けない限り、丸めが機能しないことです。

理由を説明してください。なぜ 1 を掛ける必要があるのですか?

編集 :

実際、これらのメソッドは次のようなステートメントを使用して Area を更新しています。

Area += someFormula;

ゲッターを呼び出していませんか?そうでない場合でも、最終的にラベルに値を表示しています(実際には、このプロパティをラベルの Content プロパティにバインドして、Area が Label.Content も更新されるように変更します)。

4

1 に答える 1

3

WPF の依存関係プロパティ システムがプロパティを取得するときArea、実際には呼び出しませんget_Area(つまり、getそこで宣言したもの)。代わりに、あなたが として考えることができるものを通して、舞台裏で価値を得るthis.GetValue(AreaProperty). Area *= 1(または同様の例Area = Area)を使用すると、ゲッターが実際に呼び出され、丸められた値が実際のバッキング値に設定されます。

セッターで同じことが起こるかどうかはわかりません。そのため、代わりに丸めを入れて、何かが変わるかどうかを確認してください。

public double Area
{
    get { return (double)this.GetValue(AreaProperty); } 
    set { this.SetValue(AreaProperty, Math.Round(value,2)); }
}

これがうまくいかない場合は、次の 2 つの方法のいずれかを試してください: (1) アプローチ全体を再考し、別の角度からこれに取り組みます。たとえば、文字列として表示するときに丸める必要がある場合は、文字列形式を使用してそうするか、または(2)RoundedDouble暗黙的に との間で変換するクラスを作成doubleしますが、丸めを行い、それを に使用しAreaます。

于 2013-04-03T18:11:25.730 に答える