【发布时间】:2013-07-18 03:26:17
【问题描述】:
有什么方法可以自动更新ICollectionView 上的过滤器,而无需在进行相关更改时调用Refresh()?
我有以下几点:
[Notify]
public ICollectionView Workers { get; set; }
此属性中的 [Notify] 属性只是实现了INotifyPropertyChanged,但在这种情况下它似乎没有做任何事情。
Workers = new CollectionViewSource { Source = DataManager.Data.Workers }.View;
Workers.Filter = w =>
{
Worker worker = w as Worker;
if (w == null)
return false;
return worker.Employer == this;
};
在 XAML 中:
<TextBlock x:Name="WorkersTextBlock"
DataContext="{Binding PlayerGuild}"
FontFamily="Pericles"
Text="{Binding Workers.Count,
StringFormat=Workers : {0},
FallbackValue=Workers : 99}" />
更新:看来使用ICollectionView 对我来说是必要的,所以我想重新讨论这个话题。我正在为这个问题添加一个赏金,其接收者将是任何可以提供一些关于如何实现不需要手动刷新的“放手”ICollectionView 的见解的人。在这一点上,我对任何想法都持开放态度。
【问题讨论】:
-
好吧,考虑到该属性不是 BCL,它没有涵盖这种极端情况也就不足为奇了。实际上,WPF 中没有任何内容涵盖这种情况,因此您必须自己动手。过滤器属性不是 DP,即使它是,过滤器中的任何内容都不会触发更新事件。看起来你将不得不手动触发它。也许在过滤器的主体中?您可以通过闭包进行自我引用。查看 lambda,您必须将对 Refresh 的调用卸载到 Dispatcher,以便在应用过滤器后运行。呃,并添加一个布尔“brb更新”块
-
(没有更多的字符)看起来没有任何办法解决它,除了可能在过滤器期间扩展 CVS 和更新,并检查以确保您不会持续触发更新。为什么这不是 BCL 是有道理的,对吧?过滤器触发一个更新,它触发一个过滤器,然后就……
-
感谢您的解释。看来我将手动执行此操作。
-
好吧,抱有希望。根据历史和我的经验。如果它还没有接线,那么你通常必须自己接线。而且,如果你这样做了,请在下面添加答案并给自己一些道具!而且,如果你成功了,我会再次给你 +1。
-
我对编程还很陌生,在这一点上,我不知道如何利用我所拥有的有限知识来实现这一目标。有一天,也许,但还没有。
标签: c# wpf icollectionview