Как мне явно вызвать ItemsCollection.Filter? - PullRequest
2 голосов
/ 12 февраля 2010

Как мне explicityl вызвать что-то вроде 'DoFilter' на System.Windows.Controls.ItemCollection?

Я установил его свойство Filter для предиката. Я поместил точку останова в предикат, она достигает там только при инициализации ItemsCollection, когда я вызываю m_ItemsCollection.Refresh () это не так.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Есть несколько ситуаций, когда .Refresh () не работает, но это работает:

collection.Filter = collection.Filter;

Я столкнулся с этим несколько месяцев назад. Очевидно, есть ошибка, которая не позволяет ItemsControl надежно передавать вызов Refresh () в определенных ситуациях. Я не исследовал детали.

0 голосов
/ 12 ноября 2015

Причина обновления иногда не работает, потому что этот код используется в 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;
        }
    } 

Фильтр устанавливается в базовом представлении коллекции, а не в самой ItemsCollection.

И тогда базовый метод Refresh на самом деле не вызывает что-либо для _collectionView, поэтому обновление ничего не делает!

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

Извините, что отвечаю на старый вопрос, но чувствую, что это стоит уточнить.

...