1

我有一个依赖属性“区域”:

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;

它不是在调用吸气剂吗?即使不是,最后我在标签中显示值(实际上将此属性绑定到标签 Content 属性,以便区域更改 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)); }
}

如果这不起作用,我会尝试以下两种方法之一:(1)重新考虑您的整个方法并从不同的角度来解决这个问题 - 例如,如果您只需要在显示为字符串时将其四舍五入,请使用字符串格式这样做,或者(2)创建一个RoundedDouble隐式转换为和从的类double,但在适当的情况下进行舍入,并将其用于Area.

于 2013-04-03T18:11:25.730 回答