2
您正在WPF中創建像ComboBox
一樣的自定義控件的圖像。 作爲您提供IQueryable<T>
(或任何種類的IEnumerable
集合), 的項目的來源,但您不希望允許控件調用GetIterator()
並遍歷它(某種惰性加載)。ItemsControl ItemsSource惰性加載
比方說,你從(因爲你想有控制的所有的funcionality)
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
(而延遲它)。
您認爲該怎麼做?
謝謝