Question

Je suis un peu confus quant à la création de DependencyProperty pour les propriétés qui dépendent de sources externes. Par exemple, dans une application d'échographie que j'écris, j'ai actuellement les éléments suivants dans un wrapper C ++ géré (traduit en C # pour simplifier, en implémentant INotifyPropertyChanged):

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        NotifyPropertyChanged("Gain");
    }
}

Tout mon code est utilisé dans WPF et je réfléchissais à la possibilité de remplacer INotifyPropertyChanged par DependencyProperty , et si ces modifications seraient bénéfiques. Il existe environ 30 variables similaires à celle-ci, dont la plupart sont liées à un curseur, un bloc de texte ou un autre contrôle à l'écran.

Les éléments suivants sont-ils corrects pour implémenter un DependencyProperty pour cet objet?

public int Gain
{
    get { return ultrasound.GetParam(prmGain); }
    set 
    { 
        ultrasound.SetParam(prmGain, value);
        this.SetValue(GainProperty, value); 
    }
}

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0));

Je n'ai jamais vu d'exemple où this.GetValue (GainProperty) n'a pas été utilisé. En outre, d'autres fonctions peuvent modifier la valeur. Serait-ce le changement correct aussi?

public void LoadSettingsFile(string fileName)
{
    // Load settings...

    // Gain will have changed after new settings are loaded.
    this.SetValue(GainProperty, this.Gain);
    // Used to be NotifyPropertyChanged("Gain");
}

Par ailleurs, devrais-je m'attendre à des gains de performances dans les cas où la plupart des propriétés sont liées aux données, ou plutôt, à des pertes de performances dans les cas où de nombreux paramètres ne sont PAS des données?

Était-ce utile?

La solution

Lorsque vous utilisez une propriété de dépendance, les méthodes Get et Set doivent être simplement des wrappers simples pour this.GetValue () et this.SetValue (). La raison en est que WPF n'utilise ni les accesseurs ni les installateurs pour accéder à la valeur. vous ne pouvez pas compter sur le code supplémentaire qui tourne tout le temps.

Si vous souhaitez que ces propriétés soient des propriétés de dépendance, créez une propriété de dépendance standard qui met effectivement en cache votre résultat ultrasound.GetParam (prmGain) et appelle ultrasound.SetParam (prmGain, valeur) à l'intérieur de l'événement PropertyChanged qui sera appelé de manière fiable no peu importe la façon dont la propriété est modifiée.

Bien que ce que j'ai écrit ci-dessus soit toujours correct, relire votre question me fait penser que vous pouvez peut-être mal comprendre ce qu'est une propriété de dépendance. Si cet objet wrapper C ++ est effectivement votre modèle, vous souhaitez rester avec INotifyPropertyChanged. Les propriétés de dépendance sont conçues pour être utilisées en interne par un contrôle WPF afin de faciliter la liaison et de réduire l'encombrement de la mémoire du contrôle. Ils ne sont pas censés être utilisés dans le fournisseur de données, c'est à cela que servent les interfaces de notification.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top