Фильтрация ObserverableCollection для отображения только определенных элементов

Я переходил по этой ссылке здесь: http://jacobmsaylor.com/?p=1270

но у меня с ним проблемы, пытаюсь его настроить

<ListBox Name="PageList_ListBox" MouseDoubleClick="PageList_ListBox_OnMouseDoubleClick"
                             Background="#FFC9C9C9" Margin="0,5,0,0" ItemsSource="{Binding PageCollection, ElementName=This}">

.

public static ObservableCollection<MLBPage> _PageCollection = new ObservableCollection<MLBPage>();
public static ObservableCollection<MLBPage> PageCollection
        {
            get { return _PageCollection; }
        }

public ICollectionView _PageCollectionView { get; set; }

_PageCollectionView = CollectionViewSource.GetDefaultView(_PageCollection);

private bool FilterLeadersList(object item)
{
  MLBPage page = item as MLBPage;
  if (page.templateName.Contains("Leaders List"))
  {
    return true;
  }
  else
  {
    return false;
  }
}

Мой объект MLBPage имеет 2 типа... где "templateName" может быть либо "Список лидеров", либо "Выстрелы в голову лидера".. теперь, когда я фильтрую коллекцию, добавляя к кнопке:

_PageCollectionView.Filter = FilterLeadersList;

вся коллекция просто фильтрует (_PageCollection, привязанный к списку, становится пустым), а не только элементы, которые содержат «Список лидеров» в имени....

любая помощь в том, как я могу изменить это, чтобы работать?


person user1189352    schedule 20.03.2014    source источник
comment
первому парню, который так мне помог и удалил ваш ответ .. сделайте репост, и я отдам вам должное. Это я был виноват. ваш код, вероятно, работал, я просто напортачил, так как мне нужно было сравнить templateType, а не templateName   -  person user1189352    schedule 20.03.2014


Ответы (1)


измените свой код на:

 private ObservableCollection<MLBPage> _PageCollection = new ObservableCollection<MLBPage>();            
 public ICollectionView _PageCollectionView { get; set; }

просто сделайте это один раз (например, внутри ctor)

 //ctor
 _PageCollectionView = CollectionViewSource.GetDefaultView(_PageCollection);
 _PageCollectionView.Filter = FilterLeadersList,

используйте clear, add, remove, чтобы изменить _PageCollection.

привяжите свой список к вашему представлению

<ListBox ItemsSource="{Binding _PageCollectionView}"/>

используйте Обновить, чтобы обновить фильтр

 _PageCollectionView.Refresh();
person blindmeis    schedule 20.03.2014
comment
кстати, ваша исходная привязка не работает, потому что _PageCollection не является общедоступным СОБСТВЕННОСТЬЮ - person blindmeis; 20.03.2014
comment
слепой отредактировал ОП. просто не хотел загромождать лишний раз, чтобы люди действительно прочитали пост =[ - person user1189352; 20.03.2014
comment
хм, это странно .. поэтому я следовал вашим инструкциям .. он фильтрует буквально все (список просто пуст). мой список становится пустым, когда я запускаю программу. но если я закомментирую _PageCollectionView.Filter = FilterLeadersList; появляется весь плейлист.. так что я не уверен.. - person user1189352; 20.03.2014
comment
я только что дважды проверил, чтобы убедиться, что имя шаблона в нем НЕ является списком лидеров.. вздох, я просто не знаю, почему это не сработает - person user1189352; 20.03.2014
comment
подождите, думаю, я знаю, почему ... брб - person user1189352; 20.03.2014
comment
это сработало.. моя вина. я использовал имя_шаблона вместо типа_шаблона... спасибо - person user1189352; 20.03.2014