wpf Probleme mit dependency Eigenschaften in einem UserControl
Machte ich ein Benutzersteuerelement, das aktualisiert werden soll, sobald alle paar Sekunden mit Daten von einem seriellen port. Dieses UserControl sollte sehr einfach sein, bestehend aus einer Bezeichnung für ein Feld name, und ein weiteres Etikett mit den Feld-Wert. Ich sage, dass es sollte einfach, aber es funktioniert nicht. Es aktualisiert sich nicht bei allen, und nicht einmal die Anzeige der Feldnamen.
Unten ist der code:
public partial class LabeledField : UserControl {
public LabeledField() {
InitializeComponent();
}
public string fieldName {
get { return fieldNameLabel.Content.ToString(); }
set { fieldNameLabel.Content = value; }
}
public string fieldValue {
get { return (string)GetValue(fieldValueProperty); }
set { SetValue(fieldValueProperty, value); }
}
public static readonly DependencyProperty fieldValueProperty =
DependencyProperty.Register(
"fieldValue",
typeof(string),
typeof(LabeledField),
new FrameworkPropertyMetadata(
"No Data"
)
)
;
}
Hier ist das XAML:
<UserControl x:Class="DAS1.LabeledField" Name="LF"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Orientation="Horizontal">
<Label Width="100" Height="30" Background="Gray" Name="fieldNameLabel" />
<Label Width="100" Height="30" Background="Silver" Name="fieldValueLabel" Content="{Binding fieldValue}" />
</StackPanel>
Und hier ist der XAML-Code für das Fenster, welcher sich auf das Benutzersteuerelement. Zuerst die Kopfzeile:
<Window x:Class="DAS1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:me="clr-namespace:DAS1"
Title="Window1" Height="580" Width="780">
Dann das Benutzersteuerelement selbst:
<me:LabeledField fieldName="Test" Width="200" Height="30" fieldValue="{Binding businessObjectField}"/>
Wenn ich wusste, dass der eine spezifischere Frage zu stellen, würde ich-aber kann mir jemand sagen warum das nicht funktioniert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, dass in der XAML für das Steuerelement, die Bindung war falsch angegeben.
Ursprünglich war es:
Aber ich hatte nicht angegeben das element, auf das fieldValue gehört. Es sollte (vorausgesetzt, meine Benutzer-Steuerelement mit der Bezeichnung "LF":
Wenn Sie wollen, zu binden, um die Eigenschaften der Kontrolle, sollten Sie also in der Bindung. Bindungen werden evaluiert, um
DataContext
wenn Ihre Quelle nicht explizit angegeben ist, damit Ihre Bindung nicht die Bindung zu Ihrer Kontrolle, aber den geerbten Kontext (was wahrscheinlich ist, fehlt die Eigenschaft, die Sie sind verbindlich). Was Sie brauchen, ist:Dass Sie nicht wirklich brauchen eine Abhängigkeitseigenschaft, die auf Ihrem Nutzer-Kontrolle, in der Tat Sie sollten sich bemühen, Benutzer-Steuerelemente, ohne etwas besonderes in die code-behind -, benutzerdefinierte Steuerelemente sollten so genutzt werden.
Definieren Sie Ihr Benutzersteuerelement wie folgt aus (ohne code-behind):
Dann, stellen Sie sicher, dass Ihre business-Objekt implementiert die INotifyPropertyChanged, weil Sie nicht aktualisieren können, aus Ihrem business Objekt effizient, ohne es zu ändern zumindest so viel. Die
fieldName
ist nur ein Beispiel, wie konnte Sie binden das display name auf dem Etikett automatisch um ein Grundstück, auf Ihre business-Objekt.Dann, machen Sie einfach sicher, dass der DataContext von der UserControl ist Ihr business-Objekt.
Wie soll das funktionieren? Die Label.Content-Eigenschaft ist eine DependencyProperty und Unterstützung der Bindung selbst. Ihre business-Objekt implementiert INotifyPropertyChanged und unterstützt somit updates für die Bindung - ohne es, die binding-system nicht benachrichtigt, wenn Ihr Feld Wert ändert, unabhängig davon, ob Sie gebunden es zu einer DependencyProperty an einem Ende.
Und wenn Sie wiederverwenden möchten, das Benutzer control anderswo, legen Sie einfach die gewünschte Instanz des business-Objekts, um den DataContext der gewünschten LabeledField Kontrolle. Die Bindung Haken selbst aus dem DataContext.
System.Windows.Markup.XamlParseException: 'A 'Binding' cannot be set on the 'BranchId' property of type 'BranchFilter'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.'