ComboBox
WPFのように動作するカスタム コントロールを作成しているイメージ。提供する項目IQueryable<T>
(または任意の種類のIEnumerable
コレクション) のソースとして、ただし、コントロールがそれを呼び出して反復処理することを許可したくないGetIterator()
(ある種の遅延読み込み)。
から継承するとしましょう(そのコントロールのすべての機能が必要なため)
System.Windows.Controls.Primitives.Selector
クラス。Selector クラスは、よく知られている依存関係プロパティ ItemsSource を提供する System.Windows.Controls.ItemsControl クラスから継承します。
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(ItemsControl),
new FrameworkPropertyMetadata(null, new PropertyChangedCallback(ItemsControl.OnItemsSourceChanged)));
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ItemsControl control = (ItemsControl) d;
IEnumerable oldValue = (IEnumerable) e.OldValue;
IEnumerable newValue = (IEnumerable) e.NewValue;
ItemValueStorageField.ClearValue(d);
if ((e.NewValue == null) && !BindingOperations.IsDataBound(d, ItemsSourceProperty))
{
control.Items.ClearItemsSource();
}
else
{
control.Items.SetItemsSource(newValue); // PROBLEM
}
control.OnItemsSourceChanged(oldValue, newValue);
}
私が正しく見れば、これが反復する場所です。
internal void SetItemsSource(IEnumerable value)
{
if ((!this.IsUsingItemsSource && (this._internalView != null)) && (this._internalView.RawCount > 0))
{
throw new InvalidOperationException(SR.Get("CannotUseItemsSource"));
}
this._itemsSource = value;
this._isUsingItemsSource = true;
this.SetCollectionView(CollectionViewSource.GetDefaultCollectionView(this._itemsSource, this.ModelParent));
}
そこで、ItemsSourceProperty のメタデータをオーバーライドし、それを自分の静的メソッドにポイントすることにしました。そこでは、共同呼び出しを行わないSetItemsSource
(むしろ遅延させる) 予定です。
あなたの意見では、それはどのように行われるべきですか?
ありがとうございました