Search code examples
c#icollectionview

Implementing ICollectionViewLiveShaping


How is ICollectionViewLiveShaping implemented for the purpose of filtering? Is it something like:

public ICollectionView WorkersEmployed { get; set; }

WorkersEmployed = new CollectionViewSource { Source = GameContainer.Game.Workers }.View;

I'm not using GetDefaultView because I need multiple instances of filters on this collection. If it matters, GameContainer.Game.Workers is an ObservableCollection.

ApplyFilter(WorkersEmployed);

private void ApplyFilter(ICollectionView collectionView)
{
    collectionView.Filter = IsWorkerEmployed;
}

public bool IsWorkerEmployed(object item)
{
    Worker w = item as Worker;
    return w.EmployerID == this.ID;
}

This all works, but of course it must be manually refreshed, which is why I'm trying to use ICollectionViewLiveShaping. How does live filtering working?

Update: It appears that the only way to add a property to ICollectionViewLiveShaping's LiveFilteringProperties collection is via a string. Given that limitation, is it even possible to filter by properties in another class (Workers' EmployerID in this case)?

Is what I'm trying to do in this situation is even a viable option?


Solution

  • All you need to do is add a property in LiveFilteringProperties for which you want the filter to call on property change and set IsLiveFiltering to true for your collection to enable live filtering.

    Make sure PropertyChanged event gets raised whenever EmployerID property changes i.e. your Worker class should implement INotifyPropertyChangedEvent.

    This will work then -

    public ICollectionViewLiveShaping WorkersEmployed { get; set; }
    
    ICollectionView workersCV = new CollectionViewSource
                             { Source = GameContainer.Game.Workers }.View;
    
    ApplyFilter(workersCV);
    
    WorkersEmployed = workersCV as ICollectionViewLiveShaping;
    if (WorkersEmployed.CanChangeLiveFiltering)
    {
        WorkersEmployed.LiveFilteringProperties.Add("EmployerID");
        WorkersEmployed.IsLiveFiltering = true;
    }