2013-04-03 138 views
1

我有一個依賴屬性「區」爲:Math.Round與依賴屬性,怪異行爲

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

我使用的代碼和視覺效果添加更新的區域增加了一些視覺效果。 我希望將值舍入到小數點後兩位。

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

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

正如你可以看到財產的getter是四捨五入的價值。但是,如果在調用這三種方法之後,我將「區域」乘以1或其他值,則問題四捨五入是行不通的。

請說明是什麼原因,爲什麼我需要乘以1?

編輯:

其實這些方法所使用的語句如更新面積:

Area += someFormula; 

是不是它調用的getter?即使它不是,最後我在標籤中顯示值(實際上將此屬性綁定到標籤Content屬性,因此Area更改Label.Content也會更新)。

+0

你能否確認'Area'的值正在改變爲正確的值(雖然沒有舍入)並且get/set方法總是被調用? – keyboardP

+0

實際上,您可能需要的是一種存儲具有完全精度值的屬性,另一種爲綁定目的進行四捨五入的只讀屬性。您也可以使用綁定轉換器進行舍入。 –

+0

@keyboardP是的,它似乎是這樣(我不知道,只是學習),請看編輯。 – SagarDabas

回答

3

當WPF的依賴屬性系統得到您的Area屬性時,它並不真正調用get_Area(即您在那裏聲明的get)。相反,它可以通過你認爲的this.GetValue(AreaProperty)來獲得幕後的價值。 Area *= 1(或類似的例如Area = Area)會導致您的獲取者實際被調用,並且四捨五入的值將被設置爲真實的後備值。

我不知道如果同樣的事情發生與你的setter,所以你可能想嘗試把你的舍入,而不是存在,看看是否有什麼變化:

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

如果這不起作用,我會嘗試以下兩件事之一:(1)重新思考你的整個方法,並從另一個角度來看待這個問題 - 例如如果您只是需要將它顯示爲字符串時舍入,則可以使用字符串格式來執行此操作,或者(2)創建一個RoundedDouble類,該類隱式轉換爲double,但使用四捨五入,並將其用於Area