#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 });
}
}
}
}