При изменении страницы NavigationView привязка данных теряется - PullRequest
0 голосов
/ 10 октября 2018

recording of issue

Изменение страницы с помощью элемента управления 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 Ответ

0 голосов
/ 10 октября 2018

Лучший способ состоит в том, что вы можете установить NavigationCacheMode="Required" для MainPage, чтобы избежать повторной загрузки.

Страница кэшируется, и кэшированный экземпляр повторно используется для каждого посещения независимо от размера кэша дляframe.

Это официальный документ , на который можно сослаться.

...