Laden...

TextBox-Eingaben registrieren, aber nicht anzeigen

Erstellt von Dux vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.381 Views
D
Dux Themenstarter:in
128 Beiträge seit 2004
vor 9 Jahren
TextBox-Eingaben registrieren, aber nicht anzeigen

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

2.207 Beiträge seit 2011
vor 9 Jahren

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

692 Beiträge seit 2008
vor 9 Jahren

@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

2.207 Beiträge seit 2011
vor 9 Jahren

@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

692 Beiträge seit 2008
vor 9 Jahren

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...

2.207 Beiträge seit 2011
vor 9 Jahren

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

D
Dux Themenstarter:in
128 Beiträge seit 2004
vor 9 Jahren

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

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Dux,

hilft dir meine Lösung weiter? Wenn nicht, habe ich glaube ich wirklich etwas falsch verstanden.

Gruss

Coffeebean

D
Dux Themenstarter:in
128 Beiträge seit 2004
vor 9 Jahren

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

2.207 Beiträge seit 2011
vor 9 Jahren

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

D
Dux Themenstarter:in
128 Beiträge seit 2004
vor 9 Jahren

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