Обновление списка , используемого в xaml и фрейме перезагрузки

#c# #xml #xaml #uwp

#c# #xml #xaml #uwp

Вопрос:

Итак, у меня есть XML-файл, из которого я загружаю данные в список<>. Это означает, что у меня есть основной список, содержащий все необходимые мне данные.

Из этого списка я создаю списки переменных «sub», которые я затем буду использовать для представления данных по мере необходимости.

Мое главное окно (на данный момент) содержит фрейм, который я использую для загрузки на страницах.

Моя проблема в том, что я не могу понять, как вы изменяете данные, которые будут отображаться на странице, перезагружаете их и не показываете стандартные данные.

Итак, я думаю, что есть два способа атаковать это, но мне нужен совет о том, какой правильный (рабочий) способ.

Итак, на моей странице 1 (загруженной в фрейм) у меня есть следующий код:

 public sealed partial class Page1 : Page
{
    public List<Book> Books;
    public List<Book> ts1;

    public Page1()
    {
        this.InitializeComponent();
        Books = BookManager.GetBooks();
        ts1 = Books.Where(p => p.bogNa == "Robert").ToList();
    }

    private void Update_Click(object sender, RoutedEventArgs e)
    {
        ts1 = Books.Where(p => p.bogNa != "Robert").ToList();

    }
}
  

Итак, я могу с помощью своей кнопки обновить список, но, очевидно, когда я затем перезагружаю фрейм, мы просто возвращаемся к исходной точке. Могу ли я сделать это иначе, чем на странице?

На моей странице 1 xaml у меня есть этот код:

 <GridView ItemsSource="{x:Bind ts1}" IsItemClickEnabled="True" SelectionMode="Multiple">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:Book">
                <StackPanel>
                    <Grid Height="200">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="3*" />
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="1*" />
                            <RowDefinition Height="1*" />
                        </Grid.RowDefinitions>

                        <Image Grid.Row="0" Name="pic" Width="150" Source="{x:Bind bogCo }"/>
                        <TextBlock Grid.Row="1" FontSize ="20" Text="{x:Bind bogNa}" />
                        <TextBlock Grid.Row="2" FontSize ="16" Text="{x:Bind bogRe}"/>
                        <Button Grid.Row="3" Content="More Info" FontSize="16">
                            <Button.Flyout>
                                <Flyout x:Name="FlyoutTest">
                                    <TextBlock Text="{x:Bind bogAr}">

                                    </TextBlock>
                                </Flyout>
                            </Button.Flyout>
                        </Button>
                    </Grid>

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

Есть ли способ изменить

 <GridView ItemSource="{x:bind ts1}" ...
  

На страницу, отличную от страницы 1, например, на главную страницу?

Я изучал возможность создания шаблона данных, но я не знаю, так ли это? потому что я пока не хочу тратить на это свое время, если это приведет к тем же проблемам.

Комментарии:

1. Взгляните на MVVM, сохраняя ViewModel, вы сохраняете пользовательские изменения.

2. Знаете ли вы какие-нибудь места, где я могу найти информацию по этому вопросу? Каждый раз, когда я просматриваю все учебники по версии pre x: bind, которые я нахожу. Мне действительно трудно найти что-либо на UWP..

3. Это выглядит красиво: codeproject.com/Articles/819294 /…

Ответ №1:

Одним из простых способов решения этой проблемы было бы включить страницу NavigationCacheMode for1.

Это кэширует состояние страницы 1 и показывает старое состояние при повторном открытии страницы. Просто помните, что вы не можете очистить кэш после инициализации страницы. Также NavigationCacheMode необходимо установить в конструкторе страницы.

 public Page1()
{
    this.InitializeComponent();
    NavigationCacheMode = NavigationCacheMode.Enabled; // or NavigationCacheMode.Required if you want to ignore caching limits.
    Books = BookManager.GetBooks();
    ts1 = Books.Where(p => p.bogNa == "Robert").ToList();
}
  

Но, как сказал Инбар Баркай, более чистым решением было бы сохранить ViewModel страницы 1.

Ответ №2:

Итак, я нашел хорошее решение: ObservableCollection

  public sealed partial class MainPage : Page
    {
        public List<dataRaw> t1;
        public List<dataRaw> t3;
        public ObservableCollection<dataRaw> t2;
        public MainPage()
        {
            this.InitializeComponent();
            //So you call the information from a class file (normally in Models)
            t1 = collectionGenerator.getList();
            //Then you use the t1 (List<T>) and convert it to an ObservableCollection
            t2 = new ObservableCollection<dataRaw>(t1);
        }

        private void Filter_Click(object sender, RoutedEventArgs e)
        {
            //Gather user input from a textbox (TB1)
            // clear the data in ObservableCollection t2
            t1 = collectionGenerator.getList();
            t2.Clear();
            string data = TB1.Text;

            //Check what input the user have entered
            if(data != "")
            {
            var Vtest = from VT in t1
                        where VT.firstName == data || VT.lastName == data
                        select VT;
                foreach (var VT in Vtest)
                {
                    //Add the given data back to the t2
                    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 });

                }
            }
          }
        }