Mam więc tabelę klienta, zawierającą rekordy klienta, rekord, z których każdy ma niestandardowe pole typu. Mam również niestandardową tabelę, zawierającą prawidłowe wartości pola niestandardowego typu.WPF/XAML - Umożliwienie ComboBox mieć SelectedValue, które nie jest w ItemsSource
Potrzebuję WPF do zrobienia CRUD. (Twórz, przeglądaj, aktualizuj, usuwaj).
Oczywistym rozwiązaniem jest użycie składnika ComboBox z jego właściwością SelectedValue powiązaną z polem niestandardowym, a jego właściwość ItemsSource powiązana z listą wypełnioną przez zapytanie w tabeli niestandardowego typu.
Problem polega na tym, że to nie działa, z wyjątkiem prostego problemu, który widzisz w ćwiczeniach.
Trudność pojawia się podczas przeglądania lub edytowania rekordu klienta, który ma niestandardową wartość, która nie znajduje się w niestandardowej tabeli. Może się to zdarzyć przez błąd lub może się zdarzyć, ponieważ typ niestandardowy został wycofany i usunięty z tabeli.
W tym przypadku WPF ustawia wartość pola customertype na wartość null, ponieważ wartość SelectedValue nie znajduje się na liście ItemsSource. I to jest problem.
Jeśli oglądasz tylko, powinieneś zobaczyć wartość, która znajduje się w tabeli, niezależnie od tego, czy znajduje się na liście. Jeśli edytujesz, możesz uzasadnić argument, że powinieneś również pokazać wartość, która jest w tabeli, przynajmniej początkowo, ale jeśli zmienisz wybór, nie możesz uzyskać tego, co zacząłeś.
Jakieś pomysły? Jest to problem, który występuje na prawie każdym formularzu edycji/widoku, więc wolałbym coś, co jest rozsądnie czyste w punkcie użytkowania. (To znaczy, biorąc pod uwagę wybór komplikacji w XAML, w każdym miejscu muszę obsłużyć jedno z tych pól lub komplikację w kodzie, który wspiera XAML, który wstawiam, aby obsłużyć jedno z tych pól, wolałbym ten ostatni.)
Próbuję tego, i to nie działa. Kod znajdujący się za ItemsSource combobox teraz wstawia bieżącego customerid, jeśli nie znajduje się w tym, co jest zwracane z bazy danych, jeśli przeglądamy istniejący rekord. Ale jeśli zmienię, aby edytować nowy rekord, podnoszę PropertyChanged na właściwości ItemsSource, aw debugerze widzę kod o nazwie, a także nowo utworzoną listę, która nie zawiera dodatkowej wartości, ale w interfejsie użytkownika, Wciąż widzę pierwszą listę. –
Czy sprawdzasz za pomocą ObservableCollection dla swoich ItemsSource lub INotifyPropertyChanged, gdy zmienia się kolekcja List? – Josh
Trochę zamieszania z mojej strony. Nie wychowywałem się propertychanged na nieruchomości, które myślałem, że jestem. –