我目前有一个绑定到项目集合的列表框。由于集合很大,我们希望根据在文本框中输入的文本来过滤显示的项目。
我要问的是,是否可以仅使用 XAML 来实现,我不想修改项目集合,我想根据过滤器修改每个项目的可见性。
希望它清楚,
thanks!
就像 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)