2011-09-29 5 views
2

Image que vous créez un contrôle personnalisé se comportant comme ComboBox dans WPF. En tant que source d'articles, vous fournissez IQueryable<T> (ou n'importe quel type de collection IEnumerable), mais vous ne voulez pas permettre au contrôle d'appeler le GetIterator() et de le parcourir (une sorte de chargement paresseux).ItemsControl ItemsSource chargement différé

Disons que vous héritez de la (parce que vous voulez tous les fonctionalité de ce contrôle)

System.Windows.Controls.Primitives.Selector 

classe. La classe Selector hérite de la classe System.Windows.Controls.ItemsControl qui fournit une propriété de dépendance bien connue 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); 
} 

Si je le vois correctement, c'est l'endroit où il itère.

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)); 
} 

J'ai donc décidé de passer outre les métadonnées de ItemsSourceProperty et pointer vers ma propre méthode statique, où je suis planing pas appel co SetItemsSource (délai plutôt).

Comment devrait-il être fait selon vous?

Merci

Répondre

1

Votre meilleur pari serait d'ajouter probablement une nouvelle propriété de dépendance, disent DelayedItemsSource de type IEnumerable. Ensuite, vous pouvez lier ItemsSource à DelayedItemsSource après votre retard.

Questions connexes