wpf Fehler bei der Verwendung von Abhängigkeitseigenschaften in einem Benutzersteuerelement

8

Ich habe ein UserControl erstellt, das alle paar Sekunden mit Daten von einem seriellen Port aktualisiert werden soll. Dieses UserControl sollte sehr einfach sein, bestehend aus einem Label für einen Feldnamen und einem anderen Label, das den Feldwert enthält. Ich sage, dass es sollte einfach sein, aber es funktioniert nicht. Es wird überhaupt nicht aktualisiert und zeigt nicht einmal den Feldnamen an.

Unten ist der Code:

%Vor%

Hier ist der XAML:

%Vor%

Und hier ist das XAML für das Fenster, das auf das UserControl verweist. Zuerst die Überschrift:

%Vor%

Dann das UserControl selbst:

%Vor%

Wenn ich eine spezifischere Frage hätte, die ich stellen könnte, würde ich - aber kann mir jemand sagen, warum das nicht funktioniert?

    
Klay 17.07.2009, 20:11
quelle

3 Antworten

9

Stellt fest, dass die Bindung in dem XAML für das Benutzersteuerelement falsch angegeben wurde.

Ursprünglich war es:

%Vor%

Aber ich hatte das Element nicht angegeben, zu dem fieldValue gehört. Es sollte sein (vorausgesetzt, mein Benutzersteuerelement heißt "LF":

) %Vor%     
Klay 21.07.2009, 14:43
quelle
5

Wenn Sie an Eigenschaften des Steuerelements binden möchten, sollten Sie dies in der Bindung angeben. Bindungen werden relativ zu DataContext ausgewertet, wenn ihre Quelle nicht explizit angegeben ist. Daher bindet Ihre Bindung nicht an Ihr Steuerelement, sondern an den geerbten Kontext (in dem wahrscheinlich die Eigenschaft fehlt, an die Sie binden). Was Sie brauchen, ist:

%Vor%     
Pavel Minaev 17.07.2009 20:22
quelle
4

Sie benötigen wirklich keine Abhängigkeitseigenschaft für Ihr Benutzersteuerelement. In der Tat sollten Sie danach streben, Benutzersteuerelemente ohne spezielle Komponenten im Code-Behind zu behalten. Hierfür sollten benutzerdefinierte Steuerelemente verwendet werden.

Sie sollten Ihr UserControl so definieren (ohne Code dahinter):

%Vor%

Stellen Sie dann sicher, dass Ihr Geschäftsobjekt INotifyPropertyChanged implementiert, da Sie Ihr Geschäftsobjekt nicht effizient aktualisieren können, ohne es mindestens so zu ändern. Das fieldName ist nur ein Beispiel, wie Sie den Anzeigenamen auf dem Etikett automatisch an eine Eigenschaft Ihres Geschäftsobjekts binden können.

Stellen Sie dann einfach sicher, dass der DataContext Ihres Benutzersteuerelements Ihr Geschäftsobjekt ist.

Wie wird das funktionieren? Die Label.Content-Eigenschaft ist eine DependencyProperty und unterstützt die Bindung selbst. Ihr Business-Objekt implementiert INotifyPropertyChanged und unterstützt daher Aktualisierungen der Bindung - , ohne dass das Bindungssystem benachrichtigt wird, wenn sich der Wert des Felds ändert, unabhängig davon, ob Sie es an einem Ende an eine DependencyProperty binden.

>

Und wenn Sie dieses Benutzersteuerelement anderweitig verwenden möchten, platzieren Sie einfach eine gewünschte Instanz Ihres Geschäftsobjekts in den DataContext des gewünschten LabeledField-Steuerelements. Die Bindung wird sich vom DataContext aus verbinden.

    
Kenan E. K. 17.07.2009 22:14
quelle