[英]Filtering a listview c# wpf
我正在使用此示例,並且僅在字符串成員上使用時效果很好,但是,我想在 class model 上使用它:
<Window x:Class="WpfTutorialSamples.ListView_control.FilteringSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FilteringSample" Height="200" Width="300">
<DockPanel Margin="10">
<TextBox DockPanel.Dock="Top" Margin="0,0,0,10" Name="txtFilter" TextChanged="txtFilter_TextChanged" />
<ListView Name="lvUsers">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
public partial class FilteringSample : Window
{
public FilteringSample()
{
InitializeComponent();
List<User> items = new List<User>();
items.Add(new User() { Name = "John Doe", Age = 42 });
items.Add(new User() { Name = "Jane Doe", Age = 39 });
items.Add(new User() { Name = "Sammy Doe", Age = 13 });
items.Add(new User() { Name = "Donna Doe", Age = 13 });
lvUsers.ItemsSource = items;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
view.Filter = UserFilter;
}
private bool UserFilter(object item)
{
if(String.IsNullOrEmpty(txtFilter.Text))
return true;
else
return ((item as User).Name.IndexOf(txtFilter.Text, StringComparison.OrdinalIgnoreCase) >= 0);
}
private void txtFilter_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
CollectionViewSource.GetDefaultView(lvUsers.ItemsSource).Refresh();
}
}
public enum SexType { Male, Female };
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Mail { get; set; }
public SexType Sex { get; set; }
}
}
教程鏈接:
正如您在顯示的圖像上看到的,我想搜索姓名和年齡,而不僅僅是姓名,我如何過濾兩個字段不同時?
您應該將 LvUsers ItemSource 屬性綁定到 CollectionView,而不是用戶列表。 此外,您必須在txtFilter_TextChanged
方法中定義 CollectionView 的 Filter 方法,這樣每當您更改文本時就會發生過濾。 像這樣:
public partial class FilteringSample: Window {
ListCollectionView Users {
get;
set;
}
public FilteringSample() {
InitializeComponent();
List < User > users = new List < User > {
new User() {
Name = "John Doe", Age = 42
},
new User() {
Name = "Jane Doe", Age = 39
},
new User() {
Name = "Sammy Doe", Age = 13
},
new User() {
Name = "Donna Doe", Age = 13
},
};
Users = (ListCollectionView) CollectionViewSource.GetDefaultView(users);
lvUsers.ItemsSource = Users;
}
private void txtFilter_TextChanged(object sender, TextChangedEventArgs e) {
Users.Filter = item => {
User user = item as User;
if (string.IsNullOrEmpty(txtFilter.Text))
return true;
else {
string concat = $ "{user.Name} {user.Age}";
return concat.ToLower().Contains(txtFilter.Text.ToLower());
}
};
}
}
正如您在txtFilter_TextChanged
中看到的,我連接了 Name 和 Age 字段,這樣您就可以按您喜歡的User
object 的任何字段進行搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.