Свойства зависимостей, уведомления об изменениях и значения настроек в конструкторе
У меня есть класс с 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 ответа
Вы можете попробовать это?
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
, Это обходит любые указанные метаданные, поэтому ваш propertyChanged не будет вызываться. Смотрите MSDN.
Вы не хотите выполнять recalculate(), если не установлены все три свойства, но в методе вызывается из конструктора при установке a, b и c? это правильно?
Если да, то можете ли вы просто поставить галочку в пересчете возле вершины, чтобы проверить, что все три свойства установлены, и решить, хотите ли вы выполнить или нет....
Это будет работать, потому что вы упоминаете, что
так как метод recalculate() не может сделать что-либо действительно полезное без всех трех установленных свойств.