Dlaczego CompositeCollection nie jest Freezable?
Piszę aplikację za pomocą wzorca MVVM. Dostarczam dane do mojego widoku, ustawiając właściwość DataContext mojego widoku na instancję mojego ViewModel. Generalnie używam stamtąd Binding i przechodzę dalej.
Ostatnio próbowałem zaimplementować ComboBox z „dodatkowym” elementem poza kolekcją, którą zapewnia mój ViewModel z napisem „Wybierz element”.
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding MyItemsCollection}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Problem polega na tym, że CompositeCollection nie jest Freezable:Przegląd obiektów zamrożonych. Powoduje to, że pojawia się tylko statyczny ComboBoxItem i żaden z wyników z mojego wyrażenia wiązania.
Moją pierwszą reakcją na ten problem była implementacja własnej wersji CompositeCollectionbyło Freezable. To jednak rodzi następujące pytanie:
Dlaczego CompositeCollection nie jest w ogóle Freezable?
Obawiam się, że ogólnie te decyzje są podejmowane z jakiegoś powodu i nie wydaje mi się, żebym wiedział wystarczająco dużo o Freezable, by powiedzieć, dlaczego nie odziedziczyli po nim. Wiem, że mogę wdrożyć tę kolekcję, ale obawiam się, że jeśli to zrobię, wystąpi wymierna różnica w wydajności.
Każda pomoc byłaby doceniana. Dzięki!
Ponadto: zauważ, że zdaję sobie sprawę, że mogę wstawić wartość Null lub inną specjalną wartość i podać oraz szablon lub cennik do zrobienia tego, co chcę. To nie jest pytanie, które mnie interesuje ... tylko pogrubione pytanie powyżej.
Aktualizacja:
Po kilku dalszych badaniach przeprowadzonych przez komentarz ArsenMkrt, jestem przekonany, że to było przeoczenie. Dowody są następujące:
Jest taka kolekcjajest zamrożone wywołaneFreezableCollection<T>
. Nie produkuję CollectionViews, co czyni go nieodpowiednim dla moich potrzeb bezpośrednio.Sam Bent z MSFT mówi tak samo w powyższym linku. Nie mogę jeszcze znaleźć dla niego danych kontaktowych, ale planuję omówić to z nim, jeśli będę miał szansę.Mój obecny plan obejścia tego problemu polega na stworzeniu nowej kolekcji o właściwościach CompositeCollection iFreezableCollection<T>
. Nie wiem, czy to jeszcze zadziała, ale myślę o czymś takim:
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory
Jeśli ktoś ma lepszą opcję, chciałbym to usłyszeć!