Domanda

Come faccio explicityl chiamo qualcosa come 'doFilter' su System.Windows.Controls.ItemCollection ?

Ho messo su di essa la proprietà Filter per un predicato. Ho messo un punto di interruzione nel predicato, raggiunge lì solo quando l'ItemsCollection viene inizializzato, quando chiamo m_ItemsCollection.Refresh () non lo è.

È stato utile?

Soluzione

Ci sono diverse situazioni in cui .Refresh () non funziona, ma questo fa:

collection.Filter = collection.Filter;

mi sono imbattuto in questo parecchi mesi fa. Pare che ci sia un bug che mantiene ItemsControl da tramandare in modo affidabile la chiamata Refresh () in certe situazioni. Non ho indagato i dettagli.

Altri suggerimenti

Il motivo Aggiorna a volte non funziona a causa di questo codice viene utilizzato sul ItemsCollection:

   /// <summary>
    /// Set/get a filter callback to filter out items in collection.
    /// This property will always accept a filter, but the collection view for the
    /// underlying ItemsSource may not actually support filtering.
    /// Please check <seealso cref="CanFilter"/>
    /// </summary>
    /// <exception cref="NotSupportedException">
    /// Collections assigned to ItemsSource may not support filtering and could throw a NotSupportedException.
    /// Use <seealso cref="CanFilter"/> property to test if filtering is supported before assigning
    /// a non-null Filter value.
    /// </exception>
    public override Predicate<object> Filter
    {
        get
        {
            return (EnsureCollectionView()) ? _collectionView.Filter : MyFilter;
        }
        set
        {
            MyFilter = value;
            if (_collectionView != null)
                _collectionView.Filter = value;
        }
    } 

Il filtro venga impostato sulla vista insieme sottostante, piuttosto che l'ItemsCollection stessa.

E allora il metodo di base di aggiornamento in realtà non chiamare tutto per _collectionView, quindi di aggiornamento non fa nulla!

/// <summary>
    /// Re-create the view, using any <seealso cref="SortDescriptions"/> and/or <seealso cref="Filter"/>.
    /// </summary>
    public virtual void Refresh()
    {
        IEditableCollectionView ecv = this as IEditableCollectionView;
        if (ecv != null && (ecv.IsAddingNew || ecv.IsEditingItem))
            throw new InvalidOperationException(SR.Get(SRID.MemberNotAllowedDuringAddOrEdit, "Refresh"));

        RefreshInternal();
    }  

Siamo spiacenti di rispondere alla vecchia questione, ma trovano che è la pena di chiarire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top