Pregunta

¿Cómo explico que llamo algo como 'dofilter' en System.Windows.Controls.ItemCollection?

Configuré su propiedad de filtro en un predicado. Coloqué un punto de interrupción en el predicado, llega allí solo cuando se inicializa el itemscollection, cuando llamo m_itemscollection.refresh () no lo es.

¿Fue útil?

Solución

Hay varias situaciones en las que .Refresh () no funciona, pero esto sí:

collection.Filter = collection.Filter;

Me encontré con esto hace varios meses. Aparentemente, hay un error que evita que itemscontrol pase de manera confiable la llamada de actualización () en ciertas situaciones. No he investigado los detalles.

Otros consejos

La razón por la que la actualización a veces no funciona se debe a que este código se usa en el 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;
        }
    } 

El filtro se está configurando en la vista de colección subyacente, en lugar de la propia ItemScollection.

Y luego el método de actualización base en realidad no llama a hacer nada a _collectionView, así que refrescarse no hace nada!

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

Lamento responder a la vieja pregunta, pero sentí que valía la pena aclarar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top