Propriedades de dependência, notificação de alteração e definição de valores no construtor
-
26-09-2019 - |
Pergunta
Eu tenho uma classe com 3 propriedades de dependência a, b, c. Os valores dessas propriedades são definidos pelo construtor e sempre uma das propriedades a, b ou c alterações, o método recalculado () é chamado. Agora, durante a execução do construtor, esse método é chamado 3 vezes, porque as 3 propriedades A, B, C são alteradas. O que você não é necessário, pois o método recalculado () não pode fazer nada realmente útil sem o conjunto de três propriedades. Então, qual é a melhor maneira para a notificação de mudança de propriedade, mas contornar essa notificação de mudança no construtor? Pensei em adicionar a notificação da propriedade no construtor, mas cada objeto da classe DPChangesample sempre adicionaria cada vez mais notificações de alteração. Obrigado por qualquer dica!
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);
}
}
Solução
Você pode tentar isso?
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);
}
Outras dicas
Usar DependencyObject.SetValueBase
. Isso ignora quaisquer metadados especificados, para que seu PropertyChanged não seja chamado. Ver msdn.
Você não deseja executar o recalculado (), a menos que todas as três propriedades estejam definidas, mas no ele é chamado do construtor ao definir A, B e C? Isso está correto?
Nesse caso, você não pode apenas colocar um cheque no recalculado próximo ao topo para verificar se todas as três propriedades estão definidas e decidir se você deseja executar ou não ....
Isso vai funcionar porque você menciona que
Como o método recalcular () não pode fazer nada realmente útil sem todas as três propriedades definidas.