我想通过数据源进行 UI 虚拟化。
这个想法是“过滤”我发送到 UI 的内容(在我的例子中是一个列表框)。
我注意到 ItemsSource(一个可观察的集合)被读取一次并且更改 Filter 不会触发刷新...
我不明白为什么 谢谢 乔纳森
我会尽量说得更清楚:
我有 CollectionViewSource:
<CollectionViewSource x:Key="MyItemView"
Source="{Binding Path=Model.CurrentItem}" />
然后在我的列表框中使用这个数据源:
<ListBox x:Name="myListBox"
ItemsSource="{Binding Source={StaticResource MyItemView}}"
我想实现一个转换器来返回过滤后的集合(基于当前日期):
<ListBox x:Name="myListBox"
ItemsSource="{Binding Source={StaticResource MyItemView}, Converter={StaticResource FilterByTime}, ConverterParameter=CurrentDate }"
我是这样实现的:
public class FilterByTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
System.Windows.Data.ListCollectionView list = value as System.Windows.Data.ListCollectionView;
var model = DI.Resolve<ApplicationModel>();
list.Filter = delegate(object item)
{
bool r= (((MyModel)item).OriginalDate > model.TimeLine.CurrentDate.AddMonths(-1)
&& (((MyModel)item).OriginalDate < model.TimeLine.CurrentDate.AddMonths(1)));
// Console.WriteLine ("{0}<{1}<{2} : {3}",model.MyListBox.CurrentDate.AddMonths(-1),((MyModel)item).OriginalDate ,model. MyListBox.CurrentDate.AddMonths(1),r.ToString());
return r;
};
return list;
}
return DependencyProperty.UnsetValue;
}
这工作正常...但只有在第一次弹跳时。 当前日期更改且过滤器更改时,列表不会更新。
也许我应该听 CurrentDate PropertyChange,但我不知道该怎么做
谢谢 乔纳森
最佳答案
CollectionViewSource
本身支持通过其 Filter
属性进行过滤。你为什么不把你的过滤逻辑放在那里?
关于c# - ListBox ItemsSource 动态过滤器 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435003/