MVVM パターンを使用してアプリケーションを作成しています。ビューの DataContext プロパティを ViewModel のインスタンスに設定して、ビューにデータを提供しています。通常、そこから Binding を使用して、自分のやり方で進めます。
最近、ViewModel が提供する「アイテムの選択」というコレクションを超えた「追加の」要素を持つ ComboBox を実装しようとしました。
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding MyItemsCollection}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
問題は、 CompositeCollection が Freezable: Freezable Objects Overviewではないことです。これにより、静的な ComboBoxItem のみが表示され、バインディング式の結果は表示されません。
この問題に対する私の最初の反応は、 Freezableである CompositeCollection の独自のバージョンを実装することでした。しかし、これは次の疑問を投げかけます。
そもそも CompositeCollection が Freezable でないのはなぜですか?
私の懸念は、一般的にこれらの決定には理由があり、Freezable を継承しなかった理由を説明するのに十分な知識がないと感じていることです。このコレクションを実装できることはわかっていますが、実装した場合、パフォーマンスに測定可能な違いが生じるのではないかと心配しています。
どんな助けでも大歓迎です。ありがとう!
また、Nullまたはその他の特別な値を挿入し、テンプレートまたは値コンバーターを提供して、必要なことを実行できることを認識していることに注意してください。これは私が興味を持っている質問ではありません...上記の太字の質問のみです。
アップデート:
ArsenMkrt のコメントによってもたらされたさらなる調査の後、これは実際には見落としであると信じるに至りました。証拠は次のとおりです。
- と呼ばれるフリーズ可能なコレクションがあります
FreezableCollection<T>
。CollectionViews を生成しないため、私のニーズには直接不適切です。 - MSFT の Sam Bent は、上記のリンクで同様のことを述べています。彼の連絡先はまだわかりませんが、機会があれば彼と話し合う予定です.
この問題を回避するための現在の計画は、CompositeCollection と のプロパティを持つ新しいコレクションを作成することFreezableCollection<T>
です。うまくいくかどうかはわかりませんが、次のようなことを考えています。
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory
誰かがより良い選択肢を持っているなら、私はそれを聞きたいです!