2016-08-05 71 views
0

我的应用程序显示一个ListView,它使用数据绑定来显示几个项目的列表。有些变量使用TwoWay绑定,因此更改保存在datacontext的viewmodel实例中。这是视图模型的“主要”实例,因为它包含所有项目。从绑定源过滤器列表视图项目

现在我想过滤这个列表(其中包含所有项目),只显示一部分项目。过去,我在后面的代码中创建了一个viewmodel的新实例,并将我想要显示的所有项目从我的主实例复制到新创建的viewmodel实例,然后将此新viewmodel设置为DataContext。

这工作得很好,但当我更改数据时,它只会保存到新创建的实例,而不是主实例。因此,当我更改过滤器时,项目将再次从主实例中加载,而不会在两者之间进行任何更改。

有没有什么办法来过滤我的视图模型的主要实例?我想在主实例上工作,以便自动保存更改。

ViewModel包含我自己的类的ObservableCollection,我想只显示一些根据过滤器进行绑定的项目。

回答

1

在过去,我创建了后面的代码视图模型的一个新实例,并复制了所有我想从我的主要实例表明向视图模型的新创建的实例中的项目,然后设置这个新的视图模型作为DataContext。

我认为这是没有必要创建一个新的实例,你可以直接操作这些ObservableCollectionListView源。

就比如,我创建了一个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); 
    } 
}