Ich implementiere eine Undo/Redo-Funktionalität für meine Anwendung und habe ein Problem festgestellt. Grundsätzlich habe ich ein Kombinationsfeld an eine Liste von Elementen gebunden. Dann habe ich mehrere Textfelder, die einen DataContext des ausgewählten Elements in dem Kombinationsfeld und Text an Eigenschaften dieses Elements gebunden haben. Wenn ein Benutzer einen Rückgängig-Befehl ausgibt und das Element, das rückgängig gemacht werden soll, die Textänderungen eines Textfelds ist, möchte ich zuerst das verknüpfte Element im Kombinationsfeld auswählen. Dann möchte ich die Textbox sofort mit dem Originaltext aktualisieren. Dies sollte die datengebundene Eigenschaft des ausgewählten Elements theoretisch aktualisieren. Die Auswahl ändert sich jedoch, aber die datengebundenen Textfelder werden nicht aktualisiert, bevor ich die Texteigenschaft des Textfelds ändere und daher den Eigenschaftswert für das zuvor ausgewählte Element im Kombinationsfeld ändert.Kann ich eine Aktualisierung eines Textfeld-DataContext erzwingen, das an ein ComboBox.SelectedItem gebunden ist?
Das ist mein Kombinationsfeld:
<ComboBox x:Name="myComboBox"
ItemsSource="{Binding MyItems, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Name"
SelectionChanged="myComboBox_SelectionChanged" />
Das ist mein Textfeld (die Datacontext wird auf dem übergeordneten Netz Das gleiche Verhalten tritt auf, wenn die Datacontext auf das Textfeld gesetzt ist selbst.)
<TextBox x:Name="purposeTxtBox"
Text="{Binding Purpose, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
der Code (snippet) verwende ich einmal die Undo initiiert wird, ist:
case UndoAction.PURPOSE_CHANGE:
SelectComboBoxItem(myComboBox, itemToSelect);
purposeTxtBox.Text = itemValue;
FocusAndSelect(purposeTxtBox);
Und die SelectComboBoxItem Methode:
private void SelectComboBoxItem(ComboBox box, object item)
{
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate()
{
box.SelectedItem = item;
}));
}
Ich weiß, ich kann die ‚Zweck‘ Eigenschaft auf meiner Datacontext aktualisieren. Das funktioniert, aber es konzentriert sich nicht und wählt aus, wenn ich es so mache. Da alle Bindungen bereits vorhanden sind und einige von ihnen an Ganzzahlen gebunden sind, wollte ich nur den Text aktualisieren und der "Magie" erlauben, mit den Übersetzungen umzugehen. So könnte ich eine allgemeine Lösung für jede Textbox haben. Der Vollständigkeit halber, hier ist meine FocusAndSelect Funktion:
private void FocusAndSelect(TextBox box)
{
box.SelectAll();
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate()
{
box.Focus(); // Set Logical Focus
Keyboard.Focus(box); // Set Keyboard Focus
}));
}
Seitenkommentar: Der Undo kann organisiert werden, indem der Delegat zur Liste der Delegaten hinzugefügt wird, wodurch ein Eigenschaftswert einfach zurück gesetzt wird. Dann rückgängig machen ist ein einfacher Aufruf dieses Delegaten und es aus der Liste zu entfernen. – Sinatr
@Sinatr, hast du ein Beispiel von dem, was du beschreibst, auf das du mich verweisen könntest? – JLB