3

ComboBoxWPFのように動作するカスタム コントロールを作成しているイメージ。提供する項目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(むしろ遅延させる) 予定です。

あなたの意見では、それはどのように行われるべきですか?

ありがとうございました

4

1 に答える 1

1

あなたの最善の策は、おそらくDelayedItemsSourcetypeなどの新しい依存関係プロパティを追加することIEnumerableです。その後、遅延後にItemsSourceバインドできます。DelayedItemsSource

于 2011-09-29T12:45:24.953 に答える