Свойства зависимостей, уведомления об изменениях и значения настроек в конструкторе - PullRequest
3 голосов
/ 12 июня 2010

У меня есть класс с 3 свойствами зависимостей A, B, C.Значения этих свойств устанавливаются конструктором, и каждый раз, когда изменяется одно из свойств A, B или C, вызывается метод recalculate ().Теперь при выполнении конструктора этот метод вызывается 3 раза, потому что 3 свойства A, B, C изменены.Однако в этом нет необходимости, так как метод recalculate () не может сделать что-либо действительно полезное без всех трех установленных свойств.Итак, как лучше всего уведомить об изменении свойства, но обойти это уведомление об изменении в конструкторе?Я думал о добавлении уведомления об изменении свойства в конструкторе, но тогда каждый объект класса 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 ]

1 голос
/ 12 июня 2010

Можете ли вы попробовать это?

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); 
} 
1 голос
/ 12 июня 2010

Используйте DependencyObject.SetValueBase. Это обходит любые указанные метаданные, поэтому ваш propertyChanged не будет вызываться. См. MSDN .

0 голосов
/ 12 июня 2010

Вы не хотите выполнять recalculate (), если не установлены все три свойства, но в нем он вызывается из конструктора при установке a, b и c? это правильно?

если это так, можете ли вы просто поставить галочку в пересчете возле вершины, чтобы проверить, установлены ли все три свойства и решить, хотите ли вы выполнить или нет ....

Это будет работать, потому что вы упоминаете, что

как метод recalculate () не может сделать что-нибудь действительно полезное без всего 3 свойства установлены.

...