我目前有一个绑定到一个项目集合的ListBox。由于集合很大,我们希望根据在TextBox上输入的文本来过滤要显示的项。
我想问的是,这是否可以只使用XAML实现,我不想修改项的集合,我想基于过滤器修改每个项的可见性。
希望天气晴朗,
谢谢!
发布于 2011-08-17 21:47:12
您可以使用CollectionViewSource来应用过滤,另一个示例可以在here和here中找到。
发布于 2012-11-07 18:53:05
就像CodeNaked和devdigital告诉你的那样,CollectionViewSource/CollectionView/ICollectionView是你实现目标的关键
,这是一个MVVM模式,但这是一个仅与查看相关的问题,所以我不想在ViewModel上看到这段代码。
这不是正确的方式,因为视图只显示她得到了什么,而不应该修改,所以应该/必须是你的ViewModel更改
所以现在来看一些代码片段:
public class myVM
{
public CollectionViewSource CollViewSource { get; set; }
public string SearchFilter
{
get;
set
{
if(!string.IsNullOrEmpty(SearchFilter))
AddFilter();
CollViewSource.View.Refresh(); // important to refresh your View
}
}
public myVM(YourCollection)
{
CollViewSource = new CollectionViewSource();//onload of your VM class
CollViewSource.Source = YourCollection;//after ini YourCollection
}
}Xaml片段:
<StackPanel>
<TextBox Height="23" HorizontalAlignment="Left" Name="tB" VerticalAlignment="Top"
Width="120" Text="{Binding SearchFilter,UpdateSourceTrigger=PropertyChanged}" />
<DataGrid Name="testgrid" ItemsSource="{Binding CollViewSource.View}"/>
</StackPanel>编辑我忘记了过滤器
private void AddFilter()
{
CollViewSource.Filter -= new FilterEventHandler(Filter);
CollViewSource.Filter += new FilterEventHandler(Filter);
}
private void Filter(object sender, FilterEventArgs e)
{
// see Notes on Filter Methods:
var src = e.Item as YourCollectionItemTyp;
if (src == null)
e.Accepted = false;
else if ( src.FirstName !=null && !src.FirstName.Contains(SearchFilter))// here is FirstName a Property in my YourCollectionItem
e.Accepted = false;
}发布于 2011-08-17 21:49:53
您可以使用CollectionViewSource来完成此操作。您不希望完全在XAML中执行此操作,因为如果过滤代码位于视图模型中(假设使用MVVM设计模式),则测试此操作会容易得多。
https://stackoverflow.com/questions/7093861
复制相似问题