2010-12-15 18 views
1

Relativ neu zu WPF, also ertragen Sie mit mir, wenn mir etwas offensichtlich fehlt. Ich arbeite am Erstellen eines "Zusammenfassung" Textfelds am unteren Rand des Fensters, das den Status der Anwendung beschreibt. Der Code für die Eigenschaft I binden möchten sieht ein bisschen wie folgt aus:WPF TextBox Bindung an mehrere Quellen

public String WindowDescription 
{ 
    get { return (radioButton.IsChecked == true ? "A " : "B ") + NameTextBox.Text 
+ " " + (cbRoute.SelectedItem != null? comboBox.SelectedItem.ToString() : ""); } 
} 

Und ich habe es an das Steuerelement gebunden wie so:

<TextBox IsEnabled="False" Text="{Binding Path=WindowDescription}"/> 

Die Bindung überhaupt nicht arbeiten gerade jetzt - jedes Steuerelement, auf das in WindowDescription verwiesen wird, hat einige Standardwerte, aber selbst diese Werte füllen die TextBox nicht aus. Wie ich schon sagte, ich bin neu in WPF, also zögere nicht, auf etwas hinzuweisen, das in meinem Beispiel fehlt, egal wie offensichtlich es scheinen mag. Vielen Dank.

+0

Schauen Sie sich die Debug-Ausgabe Ihrer App an. Gibt es verbindliche Fehler? – Jens

Antwort

1

Ein paar Dinge. Stellen Sie zunächst sicher, dass Ihr DataContext auf die Instanz der Klasse festgelegt ist, die die WindowDescription-Eigenschaft enthält.

Normalerweise würde dies im Codebehind für die Seite festgelegt. Es kann auch in XAML gesetzt werden, aber ich werde meine Antwort nicht komplizieren.

Zweitens, Databinding nicht automatisch Änderungen der Eigenschaftswert. Ein Benachrichtigungssystem muss in der Klasse mit der WindowDescription-Eigenschaft eingerichtet werden.

Google "INotifyPropertyChanged" mit Bing und zu sehen.

Ansonsten überprüfen Sie dieses Video!

http://channel9.msdn.com/blogs/mtaulty/silverlight-databinding-ui-to-net-classes

Luke

+0

Dies war der Schlüssel, um eine Lösung zu finden. Ich habe eine private Klasse erstellt, die eine Eigenschaft an jedes Steuerelement gebunden hat, und im Setzer jeder dieser Eigenschaften habe ich "this.Summary = getSummary()" gesetzt, was die Zeichenfolge generiert und dann in diese.Zusammenfassung gestellt hat, deren Setter erstellte ein NotifyPropertyChangedEvent und aktualisierte das Textfeld jedes Mal, wenn ein Steuerelement geändert wurde. Vielen Dank! –

0

Wenn ich raten müsste, würde ich vermuten, dass Sie den DataContext Ihrer TextBox nicht gesetzt haben (entweder direkt, oder indem Sie einen für die Eltern irgendwo angeben).

Der Bindungspfad ist relativ zu den Elementen DataContext und der Standard-DataContext ist null (und nicht das Element selbst oder sein Fenster).

0

Ich bin zu raten, Jens richtig ist, hast Du das Modell? das heißt

this.DataContext = model; 

Wo Sie Modell etwas ist, in unserem Fall, wo ich arbeiten wir Ansichtsmodell ist und das MVVM-Muster verwenden. Sie könnten längerfristig etwas wie Prism und Unity sehen, aber wenn Sie nur Ihren ganzen Code in die .cs-Datei für die XAML-Seite schreiben, ist hier ein Beispiel.

namespace DataContextTest 

{

öffentliche Teilklasse Hauptfenster: Fenster { public Mainwindow() { this.DataContext = this; MyString = "Hallo da ..."; InitializeComponent(); }

public string MyString { get; set; } 

} }

Dann in der XAML binden an MyString wie Sie in den anderen Post getan haben und es sollte natürlich arbeiten, wieder - es gibt keine Änderungsbenachrichtigung an dieser Stelle ist.Ich kann ein Beispiel dafür veröffentlichen, wenn Sie möchten, aber ich denke, dass Sie es googeln können und viele viele einfache Beispiele sehen können.

Ich hoffe, das war hilfreich.