Почему CompositeCollection не замораживается?
Я пишу приложение, используя шаблон MVVM. Я предоставляю данные своему представлению, устанавливая свойство DataContext моего представления для экземпляра моей ViewModel. Обычно я просто использую Binding оттуда и иду своим путем.
Недавно я попытался реализовать ComboBox с & quot; extra & quot; мой элемент ViewModel, который находится за пределами коллекции и содержит надпись «Выбрать элемент».
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding MyItemsCollection}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Проблема в том, что CompositeCollection не является Freezable:Обзор замораживаемых объектов, Это приводит к появлению только статического ComboBoxItem и ни одного из результатов моего выражения привязки.
Моей первоначальной реакцией на проблему было просто реализовать собственную версию CompositeCollection, котораяwas Freezable. Это, однако, напрашивается на следующий вопрос:
Why isn't CompositeCollection a Freezable in the first place?
Меня беспокоит то, что в целом эти решения принимаются по определенной причине, и я не чувствую, что знаю достаточно о Freezable, чтобы сказать, почему они не наследуют его. Я знаю, что могу реализовать эту коллекцию, но я обеспокоен, что в этом случае будет ощутимая разница в производительности.
Любая помощь будет оценена. Спасибо!
Also: please note that I realize I can insert a Null or some other special value and provide and template or valueconverter to do what I want. This is not the question I'm interested in... only the question in bold above.
Update:
После некоторых дальнейших исследований, проведенных в комментарии ArsenMkrt, я убедился, что это фактически упущение. Доказательства таковы:
There is a collection that is freezable calledFreezableCollection<T>
. I does not produce CollectionViews, which makes it inappropriate for my needs directly.
Sam Bent of MSFT says as much in the above link. I cannot find contact information for him yet, but I plan on discussing this with him if I get the chance.
Мой текущий план, чтобы обойти эту проблему, состоит в том, чтобы создать новую коллекцию со свойствами CompositeCollection иFreezableCollection<T>
, Я не знаю, сработает ли это еще, но я думаю о чем-то вроде этого:
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory
Если у кого-то есть выбор получше, я бы хотел его услышать!