Как я могу я заметно, вызовой emitscollection.filter?
-
20-09-2019 - |
Вопрос
Как я могу назвать что -то вроде «дофильтера» на System.Windows.Controls.ItemCollection
?
Я установил его свойство фильтра на предикат. Я поместил точку останова в предикате, он достигает туда только тогда, когда инициализируется элементы, когда я называю m_itemscollection.refresh (), это не так.
Решение
Есть несколько ситуаций, где .refresh () не работает, но это делает:
collection.Filter = collection.Filter;
Я столкнулся с этим несколько месяцев назад. По -видимому, есть ошибка, которая не дает элементам, чтобы надежно передавать вызов обновления () в определенных ситуациях. Я не исследовал детали.
Другие советы
Причина, по которой обновление иногда не работает, заключается в том, что этот код используется в приколе Itements:
/// <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;
}
}
Фильтр устанавливается в базовом представлении коллекции, а не на саму прицел.
И тогда метод обновления базового обновления на самом деле ничего не звонит _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();
}
Извините, что ответил на старый вопрос, но почувствовал, что это стоит прояснить.