2016-10-19 5 views
0

Так что я стоял в ситуации, когда у меня есть основной файл XML с данными. Затем этот файл данных преобразуется в список, поэтому я могу получить доступ к данным в моей программе.ObservableCollection vs INotifyCollectionChanged в UWP с MVVM

Так что пока я могу получить данные, но я не знаю, как их фильтровать и получить эту версию фильтра.

Так что скажем, у меня есть список рецептов. Теперь я хочу увидеть все рецепты с салатом в. Как мне это сделать?

Я понимаю, что мне нужна установка MVVM, и у меня это есть, но ее статичность, учитывая, что у меня сейчас есть только один список, созданный при создании представления. Так что, если я жестко код, я только хочу видеть салат, я могу это сделать, но как я могу сделать кнопку для этого? Или еще лучше окно поиска? Iv'e попытался изучить ObservableCollections или INotifyCollectionChanged, но я не уверен, что на самом деле приведет к тому, что мне нужно.

Какой был бы лучший подход?

Заранее спасибо.

+1

«Так я обнаружил решение моей проблемы ». - отлично, но затем отправляйте его как самостоятельный ответ, не добавляйте его к вопросу. См. Рекомендации на сайте. –

+0

Не понял. Iv'e сделал это здесь, и на другие должности, где я совершил ту же ошибку. – Hudlommen

ответ

0

Так что я нашел решение своей проблемы.

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<List> 
    <Person> 
     <Number>1</Number> 
     <FirstName>Frank</FirstName> 
     <LastName>Heist</LastName> 
    </Person> 
    <Person> 
     <Number>1</Number> 
     <FirstName>James</FirstName> 
     <LastName>Calder</LastName> 
    </Person> 
    <Person> 
     <Number>1</Number> 
     <FirstName>Jane</FirstName> 
     <LastName>Calder</LastName> 
    </Person> 

</List> 

Модели> Data.cs

public class dataRaw 
    { 
     public string data { get; set; } 
     public string firstName { get; set; } 
     public string lastName { get; set; } 
    } 

    public class collectionGenerator 
    { 
     public static List<dataRaw> getList() 
     { 
      var doc = XDocument.Load("Data.xml"); 
      var dataList = doc.Root 
       .Descendants("Person") 
       .Select(node => new dataRaw 
       { 
        data = node.Element("Number").Value, 
        firstName = node.Element("FirstName").Value, 
        lastName = node.Element("LastName").Value, 
       }) 
      .ToList(); 
      return dataList; 
     } 
    } 

xaml.cs

public sealed partial class MainPage : Page 
    { 
     public List<dataRaw> t1; 
     public List<dataRaw> t3; 
     public ObservableCollection<dataRaw> t2; 
     public MainPage() 
     { 
      this.InitializeComponent(); 

      t1 = collectionGenerator.getList(); 
      t2 = new ObservableCollection<dataRaw>(t1); 
     } 

     private void Filter_Click(object sender, RoutedEventArgs e) 
     { 
      t1 = collectionGenerator.getList(); 
      t2.Clear(); 
      string data = TB1.Text; 

      if(data != "") 
      { 
      var Vtest = from VT in t1 
         where VT.firstName == data || VT.lastName == data 
         select VT; 
       foreach (var VT in Vtest) 
       { 
        t2.Add(new dataRaw { data = "1", firstName = VT.firstName, lastName = VT.lastName }); 

       } 
      } 
      else 
      { 
       var Vtest = from VT in t1 
          where VT.data == "1" 
          select VT; 
       foreach (var VT in Vtest) 
       { 
        t2.Add(new dataRaw { data = "1", firstName = VT.firstName, lastName = VT.lastName }); 

       } 
      } 
      } 
     } 

XAML

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="200" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <GridView ItemsSource="{x:Bind t2}" Grid.Row="1"> 
      <GridView.ItemTemplate> 
       <DataTemplate x:DataType="data:dataRaw"> 
        <StackPanel> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <TextBlock Width="200" FontSize="48" Text="{x:Bind firstName}" Margin="0,0,20,0" Grid.Row="0"/> 
         <TextBlock Width="200" FontSize="48" Text="{x:Bind lastName}" Margin="0,0,20,0" Grid.Row="1"/> 

        </Grid> 
        </StackPanel> 
       </DataTemplate> 
      </GridView.ItemTemplate> 
     </GridView> 

     <Button Content="Filter" Name="Filter" FontSize="36" Click="Filter_Click" Width="200" Height="100" Grid.Row="2" /> 
     <TextBox Name="TB1" Height="100" Width="400" Grid.Row="2" /> 

    </Grid> 
+1

Поймите, что здесь нет следа MVVM. Стоит прочитать об этом. –

+0

Хорошо. Могу ли я изменить заголовок сообщения? – Hudlommen

+0

Да, но нет. Это все еще часть вопроса, а не ответ. –

0

Вам нужна наблюдаемая коллекция здесь, поскольку вы хотите связать просмотр списка, например, с коллекцией в viewmodel. Чтобы иметь возможность изменять представление в зависимости от фильтра поиска, вы можете передать параметр searchString из текстового поля для просмотра модели. В свойствах переданного свойства фильтра фильтруйте коллекцию, используя Linq или другие средства. И поскольку эта коллекция в viewmodel привязана к списку видов, она обновит представление, когда коллекция будет изменена (то есть функциональность наблюдаемого коллекционирования).

+1

Когда вы заменяете весь список сразу, он не должен быть наблюдаемым. –

+0

Спасибо за добавление полезного комментария. –

+0

Шахта или Хенкс? Мне просто сказали, что я не делаю, как ты должен здесь. Поэтому мне нужно посмотреть, правильно ли я сделал это на этот раз. – Hudlommen

Смежные вопросы