2016-01-29 2 views
2

У меня есть наблюдаемая коллекция объектов, которая меняет сверхурочную работу.Фильтрация ObservableCollection с результатами CollectionViewSource

ObservableCollection 
    Object 1 
    Object 2 
    ... 

Что бы я хотел сделать, это отобразить отфильтрованную версию этой информации в поле со списком. Поэтому я создал источник CollectionViewSource, который является ObservableCollection. А кто фильтр я определил:

private const string Unknown = "Unknown"; 
public DevicePackageInfo() 
{ 
    this.operatingSystemVersion = DevicePackageInfo.Unknown; 
    this.packageVersionInfo = new PackageVersionInfo(DevicePackageInfo.Unknown); 
    this.PackageVersionList = new ObservableCollection<PackageVersionInfo>() { new PackageVersionInfo(DevicePackageInfo.Unknown) }; 
    this.packageVersionCollectionView = new CollectionViewSource(); 
    this.packageVersionCollectionView.Filter += PackageHistoryFilter; 
    this.packageVersionCollectionView.Source = this.PackageVersionList; 

    this.SetSynced(); 
} 

public void PackageHistoryFilter(object sender, FilterEventArgs e) 
{ 
    if (e.Item != null) 
     e.Accepted = ((PackageVersionInfo)e.Item).OnEAC || ((PackageVersionInfo)e.Item).SelectedOnPC; 
} 

Проблема заключается в том, когда я обновить ObservableCollection мой выпадающий не обновляется.

Единственный объект, который я вижу в своем списке, это «Неизвестный», первый объект, который я добавляю в свой список во время построения класса.

Мое решение может быть не совсем правильным ... Но я озадачен. Есть ли встроенный способ для фильтрованного источника коллекции подписаться с ObservableCollection и оставаться в курсе последних событий? Как мне это сделать?

Когда я меняю свой ObservableCollection, я хочу обновить коллекцию, связанную с моим списком со списком.

Минимальный код идеален, я действительно не хочу определять новый класс коллекции, который реализует уведомляемые и т. П.

EDIT: Вот моя XAML

<ComboBox Name="cbSelection" bhvr:SelectionChangedBehaviour.Command="{Binding PackageSelectionCommand}" ItemsSource="{Binding PackageInfo.PackageVersionCollectionView.View, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding PackageInfo.PackageVersionInfo, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
           IsSynchronizedWithCurrentItem="True"> 
+0

Обычно при использовании ObservableCollection CollectionViewSource получает автоматически обновляется. Я просто попробовал, и мой ComboBox получает новые объекты, которые я добавляю к моему ObservableCollection. – ErazerBrecht

+0

Вот что я подумал. В конце концов, я понял. У меня было много вещей, которые бежали от raisepropertychanged и Update Handle и т. Д. Поэтому я удалил все это, и это сработало. – visc

ответ

0

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

public ObservableCollection<Tuple<String, String>> MyObservableCollection; 
public CollectionViewSource MyCollectionViewSource { get; set; } 

public PetViewModel() 
{ 
    this.MyObservableCollection = new ObservableCollection<Tuple<String, String>>(); 
    this.MyCollectionViewSource = new CollectionViewSource(); 
    this.MyCollectionViewSource.Source = this.MyObservableCollection; 
    this.MyCollectionViewSource.Filter += OnlyCatsFilter; 

    this.MyObservableCollection.Add(new Tuple<string,string>("Paul", "Cat")); 
    this.MyObservableCollection.Add(new Tuple<string,string>("Zoey", "Dog")); 
    this.MyObservableCollection.Add(new Tuple<string,string>("Dude", "Turtle")); 

    this.MyCollectionViewSource.View.Refresh(); 
} 

public void OnlyCatsFilter(object sender, FilterEventArgs e) 
{ 
    if (e.Item != null) 
    { 
     e.Accepted = (e.Item as Tuple<String, String>).Item2 == "Cat"; 
    } 
} 
Смежные вопросы