Hallo zusammen,
ich habe in einem Terminalprogramm ein TextBox-Control, das empfangene Textnachrichten anzeigt. Zusätzlich hat der Benutzer die Möglichkeit, selbst Zeichen einzutippen, die aber nicht der Textbox hinzugefügt, deren "KeyValues" aber registriert werden sollen. Tippt der Benutzer also beispielsweise ein "a" ein, will ich dieses "a" bemerken, aber nicht in der Textbox anzeigen.
PreviewKeyDown und e.Handled = true wäre eine Möglichkeit, aber ich bekomme nur den e.Key, aber habe beispielsweise keine Informationen, ob "a" oder "A" eingegeben wurde.
PreviewTextInput registriert nicht alle Eingaben und TextChanged impliziert, dass ein Text eingegeben wird, was aber nicht passieren soll.
Wie kann man das lösen?
Vielen Dank und Grüße,
Dux
Hallo Dux,
benutze das MVVM-Pattern und binde den Text auf ein Property im Viewmodel (DataBinding).
UpdateSourceTrigger=PropertyChanged
nicht vergessen.
Dann wird bei einer Eingabe das Property aufgerufen, dann handelst du es, wie gewünscht (abspeichern, etc.) .
Im Setter kannst du dann auch den Text wieder zurücksetzen.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
@Coffeebean:
Im Setter kannst du dann auch den Text wieder zurücksetzen.
Also ich bin nicht sicher ob das so geht...
Das Binding muss TwoWay sein, damit die TextBox sich aktualisiert. Daher muss er im Setter das Property setzten nicht das backing field, was dazuführt, dass er wieder in den Setter kommt usw...
Schöne Grüße
Quanue
@Coffeebean:
Im Setter kannst du dann auch den Text wieder zurücksetzen.
Also ich bin nicht sicher ob das so geht...
Wieso nicht?
public class MainViewModel
{
public ObservableCollection<string> EnteredValues { get; set; }
private string _myText;
public string MyText
{
get { return _myText; }
set
{
_myText = value;
EnteredValues.Add(value);
_myText = String.Empty;
}
}
public MainViewModel()
{
EnteredValues = new ObservableCollection<string>();
}
}
<StackPanel>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<ItemsControl ItemsSource="{Binding EnteredValues}"></ItemsControl>
</StackPanel>
Sollte gehen
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Also die TextBox müsste dann ReadOnly oder Disabled sein, damit der Buchstabe oder Ziffer die man gedrückt hat nicht in die TextBox geschrieben wird. Soweit ich es verstanden habe ist dies so gewünscht.
Ist die TextBox aber ReadOnly oder Disabled wird auch nie TextChanged von der GUI aus ausgelöst...
Daher muss sie nicht Readonly und Enabled sein, um über das Binding eine Änderung zu erfahren. Um nun den Buchstabe oder die Ziffer aus der TextBox zu entfernen muss man eine Art Undo machen. Dies über den Setter zu machen, denke ich, ist nicht sehr gut...
Tippt der Benutzer also beispielsweise ein "a" ein, will ich dieses "a" bemerken, aber nicht in der Textbox anzeigen.
Sagt mir, dass der Nutzer schon was eintippen soll. Genau kann uns das aber nur der TS sagen.
Ich würde auf die Eingabe reagieren, speichern, zurücksetzen. Wie gezeigt.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hallo zusammen,
danke für die bisherigen Anmerkungen.
Die Textbox kann readonly sein, der Cursor sollte vorhanden sein und der Benutzer soll das Gefühl haben, er würde in diese Textbox schreiben. Die eingegeben Zeichen werden an eine Gegenstelle geschickt, die widerum die Zeichen zurückschickt. Die so zurückgeschickten Zeichen sollen jetzt in die Textbox eingefügt werden. D.h. wenn die Gegenstelle nicht vorhanden ist oder nicht entsprechend reagiert, wird auch nichts in die Textbox geschrieben.
Gruß,
Dux
Hallo Dux,
hilft dir meine Lösung weiter? Wenn nicht, habe ich glaube ich wirklich etwas falsch verstanden.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hallo Coffeebean,
ich hab meinen Code erstmal auf ein Datanbindung umgeschrieben. Ist sinnvoller als meine vorige Variante. Das hat mir also schon mal geholfen 😃
Leider ändert das aber nichts an meinem Grundproblem, die Textbox nach meinen Wünschen kontrollieren zu können. Da scheitert es nach wie vor.
Gruß,
Dux
Hallo Dux,
gut, dann hab ich es noch nicht verstanden 😉
Was genau willst du noch kontrollieren, was du mit den Hinweisen hier noch nicht hast?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ok, dank euch hab ich es, ähnlich wie Coffeebean es vorgeschlagen hat, gelöst.
Im ViewModel gibt es eine Eigenschaft, auf die die Textbox gebunden ist. Im Setter wird nur dann der Text gesetzt, wenn ein Flag gesetzt wurde, das angibt, ob Daten von der Gegenstelle angekommen sind.
Flag gesetzt (Daten wurden empfangen):
Eigenschaft wird beschrieben und der Text in der Textbox angezeigt.
Flag nicht gesetzt (Benutzer hat die Textbox manuell beschrieben):
Eigenschaft wird nicht beschrieben und damit auch kein Text in der Textbox angezeigt. Der value der Eigenschaft wird dann der Send-Methode übergeben, die den value dann abschickt.
Danke nochmal für die Ideen!
Gruß,
Dux