gpt4 book ai didi

c# - 自动刷新 ICollectionView 过滤器

转载 作者:可可西里 更新时间:2023-11-01 03:06:47 29 4
gpt4 key购买 nike

有什么方法可以自动更新 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 的见解的人.在这一点上,我愿意接受任何想法。

最佳答案

据我所知,ICollectionView 不支持在基础源集合中的任何属性更改时刷新集合。

但您可以将 ListCollectionView 子类化,为其提供您自己的实现,以在任何更改的属性上刷新集合。示例 -

public class MyCollectionView : ListCollectionView
{
public MyCollectionView(IList sourceCollection) : base(sourceCollection)
{
foreach (var item in sourceCollection)
{
if (item is INotifyPropertyChanged)
{
((INotifyPropertyChanged)item).PropertyChanged +=
(s, e) => Refresh();
}
}
}
}

您可以像这样在您的项目中使用它 -

Workers = new MyCollectionView(DataManager.Data.Workers);

这可以在您的项目中重复使用,而不必担心在每个 PropertyChanged 上刷新集合。 MyCollectionView自动为您做这件事。

如果您使用的是 .Net4.5,您可以使用 ICollectionViewLiveShaping 实现,如 here 所述.

我已经在此处发布了针对您的问题的实现部分 - Implementing ICollectionViewLiveShaping .

该帖子的工作代码 -

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

关于c# - 自动刷新 ICollectionView 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735994/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com