WPF DependencyProperties
Ich habe gerade gemerkt ich habe die Nötigung Bindung/Abhängigkeit von Eigenschaften und nicht wirklich grundlegend zu verstehen das Konzept.
Heres die Abhängigkeit Eigenschaft:
public string Problem
{
get { return (string)GetValue(ProblemProperty); }
set { SetValue(ProblemProperty, value); }
}
public static readonly DependencyProperty ProblemProperty =
DependencyProperty.Register(
"Problem",
typeof(string),
typeof(TextBox));
XAML als so:
<TextBlock Text="{Binding Path=Problem}"/>
Bin ich das manuelle einstellen der Problem
- Eigenschaft auf einen Wert im Konstruktor des Objekts, aber es aktualisiert nicht die TextBlock
entsprechend . . . irgendwelche Ideen? Ich habe versucht Mode="OneWay"
und Mode="TwoWay"
auf die Bindung und es funktioniert immer noch nicht.
Dachte ich, das sollte doch automatisch funktionieren? Oder bin ich grundlegend etwas falsch?
Dank
- Alles sieht gut zu mir. Man muss es
DataContext
. Wie sind Sie mit der Einstellung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem, dass ist definitiv in Bezug auf Ihre DataContext. Die {Binding} - Erweiterung muss wissen, wo die Eigenschaft zu Leben, dass Sie verbindlich sind. Der Standard-Speicherort sieht es bei der Elemente DataContext, die ist standardmäßig immer auf den DataContext des Eltern-Elements. Wenn Sie zu Fuß den DataContext den logischen Baum auf das übergeordnete Fenster, Die DataContext wäre null (da der DataContext des Fensters ist null). Deshalb ist Ihre {Binding} auf Ihrem textblock sagt: "Binden Sie meine Text-Eigenschaft, um das Problem roperty von meinem DataContext...die null ist.
Gibt es ein paar Möglichkeiten, um dieses Problem zu lösen. Eine wäre, zu tun, genau wie Jobi erwähnt, und legen Sie die Element-Eigenschaft, die Sie binden, um auf das Fenster, wo die DependencyProperty ist wie folgt definiert:
Andere option wäre, um den DataContext des Fensters auf sich selbst verweisen. So werden alle Elemente, die in Inhalt es ist, alle haben den DataContext des Fensters.
Jetzt jedes mal, wenn Sie brauchen, um verbindlich definierten Eigenschaften in dem Fenster (wie dein Problem Abhängigkeitseigenschaft), dann können Sie genau dies tun:
Können Sie ElementName-Bindung hier , ein element wird im Fenster selbst.
versuchen die
typeof(object)
statttypeof(string)
.Seine Fenster im Rahmen.
XAML:
Es funktioniert, wenn ich die
RelativeSource
wie du gesagt hast, wenn es lädt, aber wenn ich dieProblem
- Eigenschaft im code manuell (dh. über das klicken auf eine Schaltfläche) es nie updates derTextBlock
mit dem neuen Wert.In Ihrem code, den Sie registrieren die Abhängigkeitseigenschaft, für die Klasse Textfeld (Letzte Zeile des Zitats).
So können Sie einen Wert für die ProblemProperty nur für Textfelder, aber ich kann nicht finden, ein beliebiges Textfeld in den code-snippets.
Sollten Sie sich Ihre Abhängigkeit von Eigenschaft für den Typ, dem der Wert zugewiesen werden, aus Ihrer Probe die richtige Wahl ist mir nicht klar,.
Sie konnte, wie Micha macht, definieren Sie ein DP des Fensters, dann setzen Sie die Eigenschaft auf Ihrer instanziiert Fenster. Oder Sie könnten definieren, die es zu jedem Namen dependency-Objekt in das Fenster, d.h. ein Objekt mit Name=m_ContentElement, und legen Sie dann Ihre Bindung an
{Binding ElementName=m_ContentElement, Path=Problem}
oder kürzer:
{Binding Problem, ElementName=m_ContentElement}
Es gibt zwei Möglichkeiten, um zu verstehen, den Grund des Problems, die Sie beschrieben.
Zuerst sollten Sie versuchen, die Eigenschaft verändert handler (in Abhängigkeit Deklaration einer Eigenschaft), und stellen Sie den Haltepunkt gibt. Sehen Sie, ob Ihre Eigenschaft verändert ist oder nicht.
In der zweiten sollten Sie die Art der Abhängigkeit Eigentümer.
Könnten Sie bitte zeigen voller xaml und codebehind?