ich habe eine Klasse die INotifyPropertyChanged implementiert. Diese Klasse hat ein paar String Properties. Ich möchte nun ein Objekt an ein Grid mit mehreren Textboxen binden. Der Mode sollte OneWayToSource sein. (um Benutzereingaben im Objekt zu speichern)
Wie mache ich das nun am besten? In den Beispielen finde ich eigentlich immer nur eine Eigenschaft an eine Textbox gebunden. Muss ich da für jede Property eine eigene Bindung erstellen, oder kann ich im XAML z. B. nur den Pfad angeben, den Rest aber im Code Behind erledigen?
Datenbindung ist nicht auf ein Target pro Source beschränkt, da ist es egal welchen Mode du nimmst. Wenn du aber OneWayToSource verwendest werden die beiden TextBoxen nicht "synchronisiert" sein, d.h. wenn du etwas in die eine TextBox eingibst wird der Wert zur Source übertragen werden, von der Source aber nicht mehr zum 2ten Target. Ebenfalls wird kein Initialer Wert an das Target übertragen. Aber das scheinst du ja so zu wollen.
public partial class MainWindow : Window { private ViewModel model; public MainWindow() { InitializeComponent(); model = new ViewModel(); model.PropertyChanged += OnVMPropertyChanged; DataContext = model; }
Codebehing wäre möglich, aber es ist wohl ein Umweg wenn es in XAML schön deklarativ erledigt werden kann. Für jede Textbox muss die Texteigenschaft separt gebunden werden an die entsprechende Eigenschaft des gebundenen Objekts - wie soll es denn sonst wissen was es anzeigen soll?
Es ist jedoch möglich die Textboxen in eine UserControl zu packen und somit hast du eine wiederverwendbares Teil - lohnt sich aber nur wenn dieselbe Konstellation öfters benötigt wird.
Du hast recht - man könnte die Frage auch andersherum gestellt ansehen. Daran habe ich gar nicht gedacht, da es irgendwie so klar ist, dass jede TextBox ihr Binding separat deklarieren muss. Wäre interessant was "der Rest", den man im CodeBehind bearbeiten könnte so beinhaltet.
Danke für Eure Antworten. @Sparky: Dein Beispiel hat mir noch mal deutlich gemacht, dass ich ja eigentlich schon im MVVM Pattern stecke (ohne es richtig mitbekommen zu haben :( ).
@gfoidl: "weil ich viel mit Anfängern (ist gegenüber niemanden böse gemeint) zu tun habe ;-)" Hier kann niemand böse werden ;) In dem Punkt sehe ich mich hierbei auf jeden Fall noch auf so einem Niveau. ;)
Was habe ich nun gemacht? Eine Mischung aus Beidem:
Schön dass das Bsp weitergeholfen hat - dein Beispiel ist aber nicht OneWayToSource... So wird per default in beide Richtungen gebunden. OneWayToSource macht sowieso fast nie Sinn, ich kann mich an irgendein Beispiel von Bea Costa entsinnen, wo das mal Sinn machte, aber sonst...