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