Laden...

ComboBox.Text wird geleert bei ItemsSource zuweisung

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.089 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
ComboBox.Text wird geleert bei ItemsSource zuweisung

Hallo,

ich habe eine ComboBox, der ich im KeyDown_Event einen neuen ItemSource zuweisen möchte. (Hintergrund: Ich möchte nur noch die Datenanzeigen, indenen "ComboBox.Text"-Inhalt enthalten möchte.

Mein Problem:

Ich tippe jetzt "M", dann öffnet sich im Debug der KeyDown-event, meine List wird zusammen gestellt mit allen Daten die ein "M" enthalten und dann als ItemsSource der Combobox zugewiesen.

Nach dem durchlauf der Routine ist aber der ComboBox.Text wieder leer und mein "M" folglich auch weg.

Wo liegt mein Fehler?

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

zeig mal die wesentlichen Code-Teile. Sonst kann nur geraten werden. Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 5

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

private List<SearchItem> SearchResult { get { return _service.GetSearchResult<SearchItem>(this.Text); } }

        private void ComboBoxEditKeyUp(object sender, KeyEventArgs e)
        {
            //Hier liegt noch der Fehler dass nach jedem Buchstaben der Inhalt entfernt wird
            ItemsSource = SearchResult;

            this.ItemsSource = SearchResult;
            if (!this.IsPopupOpen)
            {
                this.IsPopupOpen = true;
            }
            if (SearchResult.Count == 1)
            {
                this.SelectedItem = SearchResult[0];
                this.IsPopupOpen = false;

                this.IsEnabled = false;
            }
        }

Gruss

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo reloop,

verwende stattdessen lieber eine CollectionViewSource.

zero_x

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Danke für den Hinweis, aber selbst bei einer ObservableCollection wird der this.Text nach jedem KeyPress geleert.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo reloop,

hat sich damit dein Problem gelöst? Wenn ja, kannst du bitte beschreiben, wo der Fehler lag? Für die anderen wäre es sicherlich interessant zu wissen, wie du dein Problem gelöst hast.

zero_x

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Hey,

da hast du mich leider falsch verstanden.

Mein Problem, und zwar, dass nach jedem Zuweisen des ItemsSource, mein bereits getippter Text immer verschwindet.

Wenn ich ein X in die ComboBox Tippe, wird mein Event aufgerufen, der ItemsSource mit allen Texten die ein "X" enthalten gefüllt und danach ist mein ComboBox.Text aufeinmal wieder leer.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo reloop,

ich würde vermuten, dass es an der ObservableCollection<T> liegt. Versuch mal nicht direkt auf die ItemsSource zuzugreifen, sondern direkt die Daten in der ObservableCollection<T> zu ändern. Dann sollte es eigentlich funktionieren. Noch besser ist es, wenn du dazu ein attached Property programmiert. Mit diesen attached Property kannst du noch einfacher die Daten sortieren. Hier habe ich sogar ein nettes Beispiel gefunden, wie man sowas programmieren kann. Aber wie schon gesagt - verwende lieber die CollectionViewSource.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

'Hey zero_x,

ich habe nun folgendes eingebaut:


private ICollectionView View
        {
            get
            {
                return CollectionViewSource.GetDefaultView(SearchResult);
            }
        }

Damit wurde schon mal mein Problem behoben, dass der Text immer gelöscht wurde.

Nun habe ich nur noch ein Problem. Im KeyDown steht folgender Code:

            SearchResult = _service.GetSearchResult<SearchItem>(searchString);
            View.Refresh();

Die List SearchResult wird auch mit den gewünschten Daten gefüllt, jedoch steht beim öffnen der Combobox immer noch der Inhalt von vorher drin.

Sprich, er aktualisiert irgendwie den Inhalt nicht, obwohl SearchResult die richtigen Daten besitzt.

Danke schonmal für deine Hilfe(!)

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

du solltest nicht immer deine Ursprungsaufzählung neu setzten. Erstell einmal deine Collection mit allen Items, hol dir die View. Gegen die bindest du deine ComboBox. Und wenn du jetzt nach Eingabe der ComboBox filtern willst, dann tu das durch die CollectionView. Die besitzt das entsprechende Filter Delegate. Der Filter sollte das machen was du bisher in der GetSearchResult Methode hast.

Baka wa shinanakya naoranai.

Mein XING Profil.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Hallo Talla,

danke für deinen Rat, ich habe es jetzt so umgesetzt.

Eine Frage habe ich noch:

Wie rufe ich am besten die Filtermethode auf? Setze ich im KeyDown einfach immer wieder den Filter aufruf neu?

Sprich:

View.Filter = new Predicate<object>(FilterMethode);

Danke,
ihr seid echt eine spitzen Hilfe!

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

ja entweder so, gefolgt von nem Refresh der View. Oder ne andere Möglichkeit wäre, du übergibst ne anonyme Methode in Form eines Lambda Ausdrucks oder Delegates mit einer capured Variable (in deinem Fall nen String auf dem gefiltert wird) und machst dann den Refresh. Nimmt sich beides nichts.

Baka wa shinanakya naoranai.

Mein XING Profil.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Mir ist es ja schon fast unangenehm, aber wenn ich jetzt im KeyDown

View.refresh()

reinschreibe, leert er wieder, wie bereits am Anfang, mein Text. (Obwohl der Filter funktioniert!)

Bedeutet:

Ich tippe "X" und bekomme alle die mit "X" beginnen. Jedoch ist danach das Textfeld wieder leer. 😦

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

schau einfach mal hier. Da wird genau sowas gemacht mit dem vorgeschlagenen Vorgehensweise.

Baka wa shinanakya naoranai.

Mein XING Profil.