C# 数学。用依赖属性、wierd行为取整

C# 数学。用依赖属性、wierd行为取整,c#,wpf,xaml,dependency-properties,C#,Wpf,Xaml,Dependency Properties,我有一个依赖属性“区域”,如: public double Area { get { return Math.Round((double)this.GetValue(AreaProperty),2); } set { this.SetValue(AreaProperty, value); } } 我正在使用代码添加一些视觉效果,并在添加视觉效果时更新该区域。 我希望该值舍入到小数点后两位 drawQuads(builder); //Updat

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

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;

这不是在叫“救世主”吗?即使不是这样,最后我还是会在标签中显示该值(实际上将此属性绑定到label Content属性,以便区域更改label.Content也会更新)

当WPF的依赖属性系统获取您的
区域
属性时,它实际上不会调用
get\u区域
(即您在那里声明的
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
,但是,在适当的舍入情况下,并将其用于
区域

您是否可以确认
区域
的值正在更改为正确的值(尽管未舍入),并且始终调用get/set方法?实际上,您可能需要的是一个以全精度存储值的属性和另一个为绑定目的进行舍入的只读属性。您也可以使用绑定转换器进行舍入。@keyboard P是的,看起来是这样(我不确定,只是学习),请查看编辑。如果您有
公共双区
-这只是
this.GetValue(AreaProperty)
的“便利包装器”,绑定系统不会调用“便利包装器”。因此,取整代码只有在访问包装器时才会被命中。如果必须将舍入编码到属性中,则可能需要一个
强制值回调
,但我建议使用单独的属性。请参阅