问题 实现ICollectionViewLiveShaping


任何人都可以帮我正确实施 ICollectionViewLiveShaping 为了过滤?关于这个问题,我没有在网上找到很多有用的文档。这就是我所拥有的:

public ICollectionView WorkersEmployed { get; set; }

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

我没用 GetDefaultView 因为我需要在这个集合上有多个过滤器实例。如果重要, GameContainer.Game.Workers 是一个 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;
}

这一切都有效,但当然必须手动刷新,这就是我尝试使用的原因 ICollectionViewLiveShaping。我能找到的最好的例子是 这个,但不幸的是我仍然无法让它工作。鉴于我在这里有什么,任何人都可以给我一个正确的方向,让实时过滤工作?

任何帮助将不胜感激。

出于好奇,这真的是一项艰巨的任务吗?如果是这样,似乎是设计的人 ICollectionViewLiveShaping 做得很糟糕。

更新: 它似乎是添加属性的唯一方法 ICollectionViewLiveShapingLiveFilteringProperties 集合是通过字符串。鉴于这种限制,是否可以按另一个类中的属性进行过滤(在本例中为Workers'EmployerID)?

任何有经验的人都可以 ICollectionViewLiveShaping 告诉我,如果我在这种情况下尝试做什么甚至是一个可行的选择?老实说,由于完全没有文档和可用的例子,我不知道它是否存在。即使这是不可行的,也至少知道我是否在浪费时间。


12383
2017-07-25 17:47


起源



答案:


你需要做的就是 add a property 在 LiveFilteringProperties 您希望过滤器在属性更改和设置时调用 IsLiveFiltering 至 true 为您的收藏 to enable live filtering

确保 PropertyChanged 每当有事件被提出 EmployerID 财产变化即你的 Worker 上课应该实施 INotifyPropertyChangedEvent

这将工作 -

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

10
2017-07-28 09:26



这很完美!谢谢。 - Jason D
INotifyPropertyChanged是唯一正在收听的吗?即重新过滤是否由INotifyCollectionChanged触发 - MikeT
@MikeT - 是的,因为源集合本身是一个ObservableCollection,过滤器将在集合更改事件上再次触发。 - Rohit Vats
只是想确保我们都在同一页上,如果你有OC <A>并且A有OC <B> Bs作为属性,那么针对OC <A>的ICollectionViewLiveShaping,如果你提供Bs作为一个,则会重新过滤监控字段,如果您想要过滤Bs计数大于0的位置 - MikeT


答案:


你需要做的就是 add a property 在 LiveFilteringProperties 您希望过滤器在属性更改和设置时调用 IsLiveFiltering 至 true 为您的收藏 to enable live filtering

确保 PropertyChanged 每当有事件被提出 EmployerID 财产变化即你的 Worker 上课应该实施 INotifyPropertyChangedEvent

这将工作 -

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

10
2017-07-28 09:26



这很完美!谢谢。 - Jason D
INotifyPropertyChanged是唯一正在收听的吗?即重新过滤是否由INotifyCollectionChanged触发 - MikeT
@MikeT - 是的,因为源集合本身是一个ObservableCollection,过滤器将在集合更改事件上再次触发。 - Rohit Vats
只是想确保我们都在同一页上,如果你有OC <A>并且A有OC <B> Bs作为属性,那么针对OC <A>的ICollectionViewLiveShaping,如果你提供Bs作为一个,则会重新过滤监控字段,如果您想要过滤Bs计数大于0的位置 - MikeT


我对此进行了实验,看起来它不适合您(和我)想要的东西:更改过滤条件时自动过滤。当DataGrid的项源的某些属性发生更改时,它会自动过滤,但过滤条件更改时则不会自动过滤 - 您必须手动调用ICollectionViewSource.Refresh。


0
2018-02-20 07:59



对。如果你有大量的过滤器,这有点烦人,但不是最糟糕的。 - Julien