依赖项属性,更改构造函数中的通知和设置值

时间:2010-06-12 12:40:06

标签: c# dependency-properties change-notification

我有一个具有3个依赖属性A,B,C的类。这些属性的值由构造函数设置,每次属性A,B或C中的一个更改时,都会调用recalculate()方法。现在在执行构造函数期间,这些方法被调用3次,因为3个属性A,B,C被更改。 Hoewever这不是必需的,因为方法recalculate()在没有设置所有3个属性的情况下无法做任何真正有用的事情。那么什么是属性更改通知的最佳方法,但在构造函数中绕过此更改通知?我考虑在构造函数中添加属性更改通知,但是然后DPChangeSample类的每个对象将始终添加越来越多的更改通知。谢谢你的提示!

class DPChangeSample : DependencyObject
{                  
    public static DependencyProperty AProperty = DependencyProperty.Register("A", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));
    public static DependencyProperty BProperty = DependencyProperty.Register("B", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));
    public static DependencyProperty CProperty = DependencyProperty.Register("C", typeof(int), typeof(DPChangeSample), new PropertyMetadata(propertyChanged));


    private static void propertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((DPChangeSample)d).recalculate();
    }


    private void recalculate()
    {
        // Using A, B, C do some cpu intensive calculations
    }


    public DPChangeSample(int a, int b, int c)
    {
        SetValue(AProperty, a);
        SetValue(BProperty, b);
        SetValue(CProperty, c);
    }
}

3 个答案:

答案 0 :(得分:1)

使用DependencyObject.SetValueBase。这会绕过指定的任何元数据,因此不会调用propertyChanged。请参阅msdn

答案 1 :(得分:1)

你能试试吗?

private bool SupressCalculation = false;
private void recalculate() 
{ 
    if(SupressCalculation)
        return;
    // Using A, B, C do some cpu intensive caluclations 
} 


public DPChangeSample(int a, int b, int c) 
{
    SupressCalculation = true; 
    SetValue(AProperty, a); 
    SetValue(BProperty, b); 
    SupressCalculation = false;
    SetValue(CProperty, c); 
} 

答案 2 :(得分:0)

除非设置了所有三个属性,否则你不想执行recalculate(),但是在设置a,b和c时它会从构造函数调用吗?这是对的吗?

如果是这样,您是否可以在顶部附近的重新计算中检查是否已设置所有三个属性并决定是否要执行....

这会有效,因为你提到了

  

作为方法重新计算()不能做   没有全部3的任何东西真的有用   属性集。