数学.圆与依赖属性,奇怪的行为

本文关键字:依赖 属性 数学 | 更新日期: 2023-09-27 18:07:27

我有一个依赖属性'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 ?)

你可以看到属性的getter将值四舍五入。但问题是四舍五入不工作,除非我在调用这三个方法后将"面积"乘以1或其他东西。

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

编辑:

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

Area += someFormula;

它是不是在调用getter?即使它不是,最后我在标签中显示值(实际上将此属性绑定到label Content属性,以便区域更改标签)。内容也会更新)。

数学.圆与依赖属性,奇怪的行为

当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类,隐式地转换为和从double,但与你的四舍五入的地方,并使用Area