При изменении страницы NavigationView привязка данных теряется
Изменение страницы с помощью элемента управления NavigationView приводит к сбою / потере некоторых привязок данных.
модель данных:
public class Flashpoint
{
private string name;
private string description;
private string image;
public string Name
{
get { return name; }
set { name = value; }
}
public string Description
{
get { return description; }
set { description = value; }
}
public string Image
{
get { return image; }
set { image = value; }
}
}
страница xaml:
<Page
x:Class="Braytech_3.Views.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="using:Braytech_3.Views"
xmlns:data="using:Braytech_3.Models"
Style="{StaticResource PageStyle}"
mc:Ignorable="d">
<Grid x:Name="ContentArea">
<StackPanel Height="400" HorizontalAlignment="Left" VerticalAlignment="Top">
<Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="{x:Bind CurrentFlashpoint.Image, Mode=OneWay}" Stretch="UniformToFill"/>
<TextBlock Text="{x:Bind CurrentFlashpoint.Name, Mode=OneWay}" />
</StackPanel>
страница cs:
namespace Braytech_3.Views
{
public sealed partial class MainPage : Page, INotifyPropertyChanged
{
Flashpoint CurrentFlashpoint { get; set; }
public MainPage()
{
InitializeComponent();
Render();
}
public event PropertyChangedEventHandler PropertyChanged;
private void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private async void Render()
{
StorageFolder tempFolder = ApplicationData.Current.TemporaryFolder;
StorageFile APIData = await tempFolder.GetFileAsync("APIData.json");
string json = await FileIO.ReadTextAsync(APIData);
Universal request = JsonConvert.DeserializeObject<Universal>(json);
foreach (var challenge in request.response.data.challenges)
{
if (challenge.type == "flashpoint")
{
CurrentFlashpoint = new Models.Flashpoint
{
Name = challenge.name,
Description = challenge.description,
Image = $"/Assets/Images/{ challenge.slug }.jpg"
};
}
}
}
}
}
Из приведенных выше фрагментов кода пропущена ObservableCollection, которая связана с элементом управления pivot под элементом управления изображением. Работает как положено. Страница поставщиков также использует ObservableCollection. Поскольку я только пытаюсь связать отдельные элементы (текстовый блок, изображение), я не был уверен, как я могу использовать ObservableCollection, и если мне даже нужно попытаться сделать это для меня, это эквивалентно массиву элементов, где, как я пытаюсь связать один элемент.
С помощью инспектора живого дерева я смог проверить элемент управления изображением до и после потери привязки данных, но это не привело меня к ответу на вопрос, почему.
Почему он теряет свою связь и как я могу это исправить?
1 ответ
Лучший способ заключается в том, что вы могли бы установить NavigationCacheMode="Required"
для MainPage, чтобы избежать повторной загрузки.
Страница кэшируется, и кэшированный экземпляр используется повторно для каждого посещения независимо от размера кэша для фрейма.
Это официальный документ, на который вы могли бы сослаться.