在過去,我創建了後面的代碼視圖模型的一個新實例,並複製了所有我想從我的主要實例表明向視圖模型的新創建的實例中的項目,然後設置這個新的視圖模型作爲DataContext。
我認爲這是沒有必要創建一個新的實例,你可以直接操作這些ObservableCollection
爲ListView
源。
就比如,我創建了一個List
其中包含的所有數據,以及數據從這個List
添加到ObservableCollection
:
<Page.DataContext>
<local:MainPageViewModel x:Name="VM" />
</Page.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="4*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ListView ItemsSource="{x:Bind VM.peopleCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Name, Mode=TwoWay}" />
<TextBox Text="{Binding Company, Mode=TwoWay}" />
<TextBox Text="{Binding Age, Mode=TwoWay}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel Grid.Row="1">
<Button Content="Age From 20-29" Click="{x:Bind VM.Age_Filter}" />
<Button Content="Company AA" Click="{x:Bind VM.Company_Filter}" Margin="0,10" />
<Button Content="Name Peter" Click="{x:Bind VM.Name_Filter}" />
</StackPanel>
<Button Content="Show All" Click="{x:Bind VM.Show_All}" Grid.Row="2" />
</Grid>
代碼在MainPageViewModel
背後:
public class MainPageViewModel
{
public MainPageViewModel()
{
peopleList.Add(new Person { Name = "Jay", Company = "AA", Age = 25 });
peopleList.Add(new Person { Name = "Peter", Company = "BB", Age = 35 });
peopleList.Add(new Person { Name = "Jayden", Company = "AA", Age = 27 });
peopleList.Add(new Person { Name = "John", Company = "AAC", Age = 26 });
peopleList.Add(new Person { Name = "Alan", Company = "BB", Age = 45 });
peopleList.Add(new Person { Name = "Frank", Company = "BB", Age = 29 });
peopleList.Add(new Person { Name = "Ami", Company = "AA", Age = 24 });
peopleList.Add(new Person { Name = "Elvis", Company = "AA", Age = 30 });
peopleCollection.Clear();
foreach (var person in peopleList)
{
peopleCollection.Add(person);
}
}
private static List<Person> peopleList = new List<Person>();
public ObservableCollection<Person> peopleCollection = new ObservableCollection<Person>();
public void Age_Filter(object sender, RoutedEventArgs e)
{
foreach (var person in peopleList)
{
if (person.Age > 29 || person.Age < 20)
peopleCollection.Remove(person);
}
}
public void Company_Filter(object sender, RoutedEventArgs e)
{
foreach (var person in peopleList)
{
if (person.Company != "AA")
peopleCollection.Remove(person);
}
}
public void Name_Filter(object sender, RoutedEventArgs e)
{
foreach (var person in peopleList)
{
if (person.Name != "Peter")
peopleCollection.Remove(person);
}
}
public void Show_All(object sender, RoutedEventArgs e)
{
peopleCollection.Clear();
foreach (var person in peopleList)
{
peopleCollection.Add(person);
}
}
}
在數據Person
類的模型,只有三個屬性:名稱,公司和年齡。
public class Person : INotifyPropertyChanged
{
private string _Name;
public string Name
{
get { return _Name; }
set
{
if (value != _Name)
{
_Name = value;
OnPropertyChanged();
}
}
}
private string _Company;
public string Company
{
get { return _Company; }
set
{
if (value != _Company)
{
_Company = value;
OnPropertyChanged();
}
}
}
private int _Age;
public int Age
{
get { return _Age; }
set
{
if (value != _Age)
{
_Age = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
正如你所看到的,我從ObservableCollection
刪除項目時過濾器,這將使基於上次過濾結果的過濾。如果你想根據所有項目進行過濾,你可以例如這樣的代碼:
public void Company_Filter(object sender, RoutedEventArgs e)
{
peopleCollection.Clear();
foreach (var person in peopleList)
{
if (person.Company == "AA")
peopleCollection.Add(person);
}
}