Frage

Ich baue eine Silverlight-Anwendung und einer meiner Einsprüche vom letzten Mal war, dass, wenn Sie etwas brauchen direkt in Silverlight / WPF Weise getan Sie bräuchten Ihre Objekte als DependecyObject zu modellieren und DependencyProperty (n) verwenden

Ich finde dieses Modell eher umständlich, erfordern statische Felder und initializers in der Hälfte der Klassen I verwenden, so ist es eine gute Idee, um die guten alten ereignisgesteuert (Beobachter-Muster?) Anstelle von DependencyObject zu benutzen?

Ich bin mit dem Ziel Code aufblasen und Kesselplatten zu minimieren (ich hasse sie) und möchte wirklich wissen, ob jemand mit Erfahrung in Silverlight / WPF irgendwelche Tipps hat / Techniken für die Aufbewahrung Nutzung von DependencyObject und DependencyProperty auf ein Minimum

Ist das eine gute Idee?

War es hilfreich?

Lösung

Eigentlich in Silverlight können Sie nicht DependencyObjects erben, und so sollten Sie (und müssen) implementieren INotifyPropertyChanged statt.

Implementierung von INotifyPropertyChanged viele Vorteile gegenüber DependencyObjects hat (ich werde abkürzen dies tun, um es einfacher zu machen) und mit DependencyProperties (DPs):

  • Das ist leichter
  • Hier können Sie mehr Freiheit, Ihre Objekte in der Modellierung
  • leicht serialisiert werden kann
  • Sie können das Ereignis auslösen, wenn Sie möchten, die in bestimmten Szenarien nützlich sein kann, zum Beispiel, wenn Sie mehrere Änderungen in nur einem UI-Betrieb bündeln wollen, oder wenn Sie müssen das Ereignis selbst wenn die Daten zu erheben habe nicht Wechsel (zu zwingen, neu zu zeichnen ...)

Auf der anderen Seite, vererben DOs in WPF hat die folgenden Vorteile:

  • Einfacher implementieren vor allem für Anfänger.
  • erhalten Sie einen Rückruf-Mechanismus (fast) kostenlos, so dass Sie benachrichtigt, wenn der Eigenschaftswert ändert
  • werden
  • Sie einen Zwang Mechanismus erhalten mit ermöglicht es Ihnen, Regeln für max, min und Barwert der Eigenschaft zu definieren.

Es gibt auch andere Überlegungen, aber diese sind die wichtigsten.

Ich denke, der allgemeine Konsens ist, dass DPs für Kontrollen groß ist (und Sie können eine Custom mit benutzerdefinierten DPs auch in Silverlight implementieren), aber für Datenobjekte sollten Sie eher INotifyPropertyChanged implementieren.

HTH, Laurent

Andere Tipps

Es hängt wirklich davon ab, welche Objekte Sie sich beziehen. Wenn das Objekt soll in der XAML-Baum sitzen, seine besten DependencyProperties zu verwenden (und damit DependencyObject erben - die alle UIElements tun), um alle Vorteile zu ermöglichen, die DependencyProperties liefern (wobei animierbaren, Binden, optional automatische Kinder Vererbung, etc.). Ich empfehle Ihnen, lesen Sie die MSDN Überblick über DependencyProperties, wenn Sie haven‘ t bereits.

Wenn das Objekt eine Dateneinheit ist (dh. Sie binden ihre Werte etwas in dem Baum XAML), dann gibt es keine Notwendigkeit zu erben von DependencyObject. Wenn die Eigenschaften für das Objekt sind schreib schreiben Sie INotifyPropertyChanged , die Bindungen erlauben wird, automatisch aktualisiert, wenn sich der Wert ändert.

ich mit Richard darüber einig, dass es auf dem Zweck Ihrer Klasse abhängt, sondern als Hinweis scheint es, dass Sie von DependencyObject direkt in Silverlight 2.0 Veröffentlichungs erben, ohne von UIElement oder Usercontrol erben zu müssen. Immerhin mache ich das in meinem (Silverlight 2.0 RTW) App.

System.Windows.DependencyObject auf MSDN

  

Es ist nicht typisch direkt für die meisten Szenarien von DependencyObject abzuleiten. Stattdessen könnte man von einer bestimmten Steuerung, von einem der Steuerbasisklassen ableiten (Content; Kontrolle; Itemscontrol), von Framework oder aus Nicht-Kontrollklassen, die noch in UI teilnehmen wie Panels oder Gitter. Die Ableitung von DependencyObject könnte sinnvoll sein, wenn Sie ein Geschäft oder Datenspeicherobjekt definieren, wo Sie Abhängigkeitseigenschaften aktiv sein sollen, oder wenn Sie eine Service-Support-Klasse erstellen, die Eigenschaften werden selbst angebracht ist.

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top