2011-09-29 78 views
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(而延遲它)。

您認爲該怎麼做?

謝謝

回答

1

你最好的選擇將可能增加新的依賴屬性,說IEnumerableDelayedItemsSource。然後,您可以在延遲後綁定ItemsSourceDelayedItemsSource