2016-08-05 73 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); 
    } 
}