2013-04-03 50 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