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?
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!"
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
Hallo reloop,
verwende stattdessen lieber eine CollectionViewSource.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Danke für den Hinweis, aber selbst bei einer ObservableCollection wird der this.Text nach jedem KeyPress geleert.
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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.
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.
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
'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(!)
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.
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!
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.
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. 😦
Hallo,
schau einfach mal hier. Da wird genau sowas gemacht mit dem vorgeschlagenen Vorgehensweise.
Baka wa shinanakya naoranai.
Mein XING Profil.