Свойства зависимости, изменение уведомления и значения установки в конструкторе

StackOverflow https://stackoverflow.com/questions/3028680

Вопрос

У меня есть класс с 3 Свойства зависимости A, B, C. Значения этих свойств устанавливаются конструктором и каждый раз, когда называется один из свойств A, B или C изменений, призывается метод, пересчитанный (). Теперь во время выполнения конструктора этот метод называется 3 раза, потому что 3 свойства A, B, C изменены. Useever Это не нужно, поскольку метод пересчитывается () не может сделать что-то действительно полезное без всех 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);
    }
}
Это было полезно?

Решение

Вы можете попробовать это?

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); 
} 

Другие советы

Использовать DependencyObject.SetValueBase. Отказ Это обходит какие-либо метаданные, указанные, поэтому ваша недвижимость не будет вызвана. Видеть MSDN.

Вы не хотите выполнять пересчет (), если только все три свойства не установлены, но в той он вызывается от конструктора при настройке A, B и C? это правильно?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top