Cześć!
Mógłby ktoś doświadczony napisać, w jaki sposób rozwiązać, w sposób elegancki, poniższy problem? To co piszę, to rzecz jasna swego rodzaju pseudokod, ale każdy powinien zrozumieć co mam namyśli.
Załóżmy, że korzystam z zewnętrznego API, które zwraca mi pewną listę obiektów "FakeObject".
We ViewModelu uzupełniam listę, którą następnie chcę wyświetlić w ComboBoxie. VM oczywiście implementuje wszystkie potrzebne interfejsy i umie powiadamiać widok o ewentualnych zmianach.
List<FakeObject> FakeObjects = externalAPI.GetListOfFakeObjects();
Dodatkowo potrzebuję mieć informację, który obiekt jest aktualnie wybrany. W tym celu tworzę kolejne property:
SelectedFakeObject i binduje do niego SelectedItem z widoku.
Do tej pory wszystko jest super. Jednak dochodzi mi dodatkowe (pewnie dość częste) wymaganie. Jako pierwszy item w combo potrzebuję wyświetlić dodatkowe pole z wartością "XYZ". Mogę to rozwiązać za pomocą XAML-a.
<ComboBox.Resources>
<ResourceDictionary>
<CollectionViewSource x:Key="ViewSource" Source="{Binding FakeObjects}" />
</ResourceDictionary>
</ComboBox.Resources>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem>XYZ</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource ViewSource}}" />
</CompositeCollection>
(...)
We VM zmieniam SelectedFakeObject na tym Object i wszystko prawie działa. Mam fajne rozróżnienie, czy wybrany element jest to FakeObject (operator is), czy nie. Ale jak w takim podejściu ustawić pierwszy element jako domyślnie wybrany? Jeśli ustawię SelectedIndex w widoku, to to nie zadziała, bo mój SelectedFakeObject da tam nulla i domyślnie nadal nie będzie nic ustawione. Dodatkowo jeśli chciałbym mieć przycisk Reset we VM, to też chyba nie uda mi się przywrócić elementu "XYZ". Dodam, że wygodnie jest mieć listę obiektów FakeObject, a nie wrapper, który zawiera jeden string i pozostałe elementy są kopiami FakeObject - bo to wymusza na mnie sprawdzanie warunków w kilku innych miejsach.
W jaki sposób rozwiązać ten problem z dodatkowym elementem w liście, który jest zwykłym stringiem i pełni funkcje nie wybrania niczego? W jaki sposób wybrać domyślne zaznaczenie tego elementu?