Propriedades de dependência, notificação de alteração e definição de valores no construtor

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

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);
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top