Laden...

Standardwert für Eigenschaft mit leerer Klasse

Erstellt von BJA-CH vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.349 Views
B
BJA-CH Themenstarter:in
59 Beiträge seit 2017
vor 5 Jahren
Standardwert für Eigenschaft mit leerer Klasse

Salü zäme
Ich komme da bei einer Sache nicht weiter.
Ich habe ein DependencyProperty aufgebaut, welche ein Element einer Klasse beinhaltet. Als Standartwert möchte ich eine leere Klasse erzeugen und übergeben.
Das habe ich so gelöst (Ausschnitt):



        public static readonly DependencyProperty MitPlanetenProperty =
            DependencyProperty.Register("MitPlaneten", typeof(planetenSicht), typeof(HimmelControl),
                new FrameworkPropertyMetadata(new planetenSicht(), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnMitPlanetenPropertyChanged)));

        public planetenSicht MitPlaneten
        {
            get { return (planetenSicht)GetValue(MitPlanetenProperty); }
            set { SetValue(MitPlanetenProperty, value); }
        }

Dazu habe ich, wie oben ersichtlich, im FrameworkPropertyMetadata den Standartwert "new planetenSicht()" übergeben.

Hier ein kurzer Blick in die Klasse "planetenSicht":



namespace UserDefinedControls.Klassen
{
    public class planetenSicht : DependencyObject, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private bool _mitMerkur = false;
        private bool _mitVenus = false;
        private bool _mitErde = false;
….
        public planetenSicht()
        { }

        public bool MitMerkur
        {
            get { return this._mitMerkur; }
            set
            {
                this._mitMerkur = value;
                this._anzeigePlaneten[1] = value;
                this.RaisePropertyChanged("MitMerkur");
            }
        }
….

Als Ergebnis bekomme ich dann aber einen Laufzeitfehler mit folgendem Inhalt:> Fehlermeldung:

Der Standardwert für die Eigenschaft "MitPlaneten" kann nicht an einen bestimmten Thread gebunden werden.

Ich verstehe diese Fehlermeldung nicht.
Kann mir jemand dies erklären...
Besten Dank und Gruss

16.842 Beiträge seit 2008
vor 5 Jahren

Du solltest in Englisch Programmieren.
Das gilt für den Code wie auch für das System - so ist das nun mal. 😉

Dann würdest Du vermutlich auch unter der englischen Fehlermeldung > Fehlermeldung:

default value for the property cannot be bound to a specific thread mehr Treffer auf Google finden 😉
[Artikel] C#: Richtlinien für die Namensvergabe -> gibt ja nicht umsonst Richtlinien u.a. von Microsoft 😉

So wie ich das sehe ist Deine gebaute Dependency einfach nicht Thread-Safe - daher auch der Fehler.
Ich weiß nicht, ob das in WPF noch best practise ist; aber zumindest früher musste solche Objekte via Freezable implementieren.

Edit: oder noch besser nach MVVM entwickeln, siehe Folgebeitrag von MrSparkle.

5.658 Beiträge seit 2006
vor 5 Jahren

Diese Logik gehört eigentlich ins ViewModel, und nicht in die View. Wenn du das ganze im ViewModel implementierst, hast du diese Probleme nicht. Dann brauchst du keine DependencyProperties zu erstellen und mußt nur die entsprechende ViewModel-Eigenschaft an das (Dependency-)Property der View zu binden.

Hier gibt es mehr Infos dazu: [Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

B
BJA-CH Themenstarter:in
59 Beiträge seit 2017
vor 5 Jahren
Noch einmal zum Thema ViewModel

Hallo zäme
Ich verstehe in der Zwischenzeit das Konzept von MVVM. Über die wirklichen Vorteile bin ich mir noch nicht ganz klar. Aber sicher wäre eine einheitliche Arbeitsweise ein guter Grund konsequent dies umzusetzen.

Wie sieht es aber bei "Benutzersteuerelementen" (UserDefinedControls) aus. Ich habe ein Control gebaut, das in der View drei geschachtelte Canvas-Elemente besitzt sonst aber nichts.
Ich schreibe direkt in diese Canvas und platziere dort weitere Controls. Macht es da nun wirklich Sinn, den Code in ein ViewModel auszulagern. Er wird dort ja genau gleich aussehen, wie wenn ich diesen direkt im UserDefinedControl belasse.
Ja eigentlich würde er ja noch etwas komplizierter werden, weil ich ja die Vanvas-Flächen über ein Property an das ViewModel übergeben müsste.

Wie müsste man dies effektiv gestalten, wenn ich aus einer ViewModel-Klasse in ein Canvas schreiben möchte, das in der View liegt?
Entweder betrachte ich dies viel zu kompliziert oder schaue hier nicht ganz durch!

Wer kann mir da eine gescheite Anwort geben???

5.658 Beiträge seit 2006
vor 5 Jahren

Wie müsste man dies effektiv gestalten, wenn ich aus einer ViewModel-Klasse in ein Canvas schreiben möchte, das in der View liegt?

Das ViewModel schreibt nirgends in die View. Stattdessen solltest du DataBinding verwenden, denn das ist der einfachste Weg. Zum Thema DataBinding und Canvas findest du hier im Forum auch schon einige Beiträge.

Weeks of programming can save you hours of planning