Math.Round具有依赖属性,奇怪的行为

时间:2013-04-03 18:03:06

标签: c# wpf xaml dependency-properties

我有一个依赖属性'Area':

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 ?)

正如你所看到的,该物业的吸气剂正在四舍五入。但问题是四舍五入不起作用,除非我在调用这三种方法之后将'Area'乘以1或其他东西。

请解释原因,为什么我需要将它乘以1?

编辑:

实际上这些方法正在使用如下语句更新Area:

Area += someFormula;

它不是在呼唤吸气剂吗?即使它不是,最后我在标签中显示值(实际上将此属性绑定到标签Content属性,以便Area更改Label.Content也更新)。

1 个答案:

答案 0 :(得分:3)

当WPF的依赖属性系统获得您的Area属性时,它并不真正调用get_Area(即您在那里声明的get)。相反,它通过你能想到的this.GetValue(AreaProperty)来获得幕后的价值。 Area *= 1(或类似的,例如Area = Area)会导致实际调用您的getter,然后将舍入值设置为实际支持值。

我不确定你的setter是否会发生同样的事情,所以你可能想尝试将你的舍入放在那里,看看是否有任何变化:

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

如果这不起作用,我会尝试以下两种方法之一:(1)重新思考整个方法,并从不同的角度来看待这个问题 - 例如如果您只是在显示为字符串时需要将其四舍五入,请使用字符串格式来执行此操作,或者(2)创建一个隐式转换为RoundedDouble的{​​{1}}类,但将其舍入到位,并将其用于double

相关问题