ItemsControl ItemsSource ленивая загрузка - PullRequest
3 голосов
/ 29 сентября 2011

Изображение, вы создаете пользовательский элемент управления, ведущий себя как ComboBox в WPF.В качестве источника элементов вы предоставляете IQueryable<T> (или любой тип коллекции IEnumerable), но не хотите, чтобы элемент управления вызывал GetIterator() и выполнял итерацию по нему (что-то вроде ленивой загрузки).

Допустим, вы наследуете (потому что вам нужна вся функциональность этого элемента управления)

System.Windows.Controls.Primitives.Selector

класса.Класс Selector наследуется от класса System.Windows.Controls.ItemsControl, который предоставляет хорошо известное свойство зависимостей ItemsSource.

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 (скорее, задержать его).

Как это должнобыть сделано по вашему мнению?

Спасибо

1 Ответ

1 голос
/ 29 сентября 2011

Лучше всего было бы добавить новое свойство зависимости, скажем, DelayedItemsSource типа IEnumerable. Затем вы можете связать ItemsSource с DelayedItemsSource после вашей задержки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...