2016-01-29 63 views
2

我有一個可觀察的超時更改的對象集合。使用CollectionViewSource篩選ObservableCollection會產生

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時,我想更新綁定到我的組合框的集合。

最小代碼是理想的,我真的不想定義一個實現通知等的新集合類。

編輯:這是我的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

常自動更新。我只是試過了,我的ComboBox獲取了添加到我的ObservableCollection中的新對象。 – ErazerBrecht

+0

這就是我的想法。我終於明白了。我有很多事情是由raisepropertychanged和Update Handle等等來運行的...所以我刪除了所有這些,並且它工作。 – visc

回答

0

我寫了這件事,使人們可以得到什麼樣的解決方案看起來像一個想法:當你使用一個ObservableCollection的CollectionViewSource得到

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"; 
    } 
}