Привязка данных Xamarin не обновляется - PullRequest
0 голосов
/ 08 апреля 2020

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

В настоящее время я могу передать контекст привязки в Страница ContactEdit, но изменение не отражается на главной странице. Даже после ввода текста на странице ContactEdit и перехода на главную страницу, я могу вернуться на страницу ContactEdit и просмотреть измененные данные. Я просто не понимаю, чего мне не хватает, чтобы обновить / показать эту информацию на главной странице.

Вот как вытягивается мой код

Для моей модели у меня есть контакт .cs

using System;
using System.Collections.Generic;
using System.Text;

namespace DulyNoted.Models
{
    public class Contact
    {
        public string Name //automatic properties
        {
            get;
            set;
        }

        public string Position
        {
            get;
            set;
        }

        public string PhoneNumber
        {
            get;
            set;
        }

        public string Email
        {
            get;
            set;
        }
    }
}

Затем у меня есть ContactServices.cs для работы с моделью

using System;
using System.Collections.Generic;
using System.Text;
using DulyNoted.Models;

namespace DulyNoted.Services
{
    public class ContactServices
    {
        public ContactServices()
        {

        }

        public Contact GetContacts()
        {
            Contact contact = new Contact();
            contact.Name = "Jane Doe";
            contact.Position = "Staff Member";
            contact.PhoneNumber = "6175550181";
            contact.Email = "JaneDoe@gmail.com";
            return contact;
        }
    }
}

Затем у меня есть реализация для ViewModelBase.cs, которая реализует INotifyPropertychanged. Это наследуется ContactViewModel.cs, как показано ниже.

using System; 
using System.Collections.Generic; 
using System.Text; using DulyNoted.Models; 
using DulyNoted.Services;

namespace DulyNoted.ViewModels 
{
    public class ContactViewModel : ViewModelBase
    {
        private Contact contactList;

        public ContactViewModel()
        {
            var service = new ContactServices();

            ContactList = service.GetContacts();
        }

        public Contact ContactList
        {
            set { SetProperty(ref contactList, value); }
            get { return contactList; }
        }
    } 
}

My MainPage.xaml.cs Я создал свойство, чтобы моя кнопка ссылалась на тот же ContactViewModel, что и главная страница

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using DulyNoted.Models;
using DulyNoted.ViewModels;
using DulyNoted.Views;

namespace DulyNoted
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public ContactViewModel contactViewModel;
        public MainPage()
        {
            InitializeComponent();
            contactViewModel = new ContactViewModel();
            this.BindingContext = contactViewModel;

        }

        async void OnButtonClicked(object sender, EventArgs args)
        {
            var contactEditPage = new ContactEdit();
            contactEditPage.BindingContext = contactViewModel;
            await Navigation.PushAsync(contactEditPage);
        }
    }
}

Первоначальная привязка работает, поскольку мои метки показывают свойства контакта (MainPage.xaml)

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="DulyNoted.MainPage">
    <StackLayout>
        <Label Text="{Binding ContactList.Name, Mode=TwoWay}"/>
        <Label Text="{Binding ContactList.Position, Mode=TwoWay}"/>
        <Label Text="{Binding ContactList.PhoneNumber, Mode=TwoWay}"/>
        <Label Text="{Binding ContactList.Email, Mode=TwoWay}"/>
        <Button x:Name="EditContact" Text="Click to Edit Contact" Clicked="OnButtonClicked"/>
    </StackLayout>
</ContentPage>

Когда я перехожу на ContactEdit.xaml; Я вижу заполнение моей первоначальной привязки, которое показывает, что мое другое представление получает информацию из модели представления.

For reference my ContactEdit.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="DulyNoted.Views.ContactEdit">
    <ContentPage.Content>
        <StackLayout>
            <Entry x:Name="NameEntry" Placeholder="Name" Text="{Binding ContactList.Name, Mode=TwoWay}"/>
            <Entry x:Name="PositionEntry" Placeholder="Position" Text="{Binding ContactList.Position, Mode=TwoWay}"/>
            <Entry x:Name="PhoneNumberEntry" Placeholder="PhoneNumberEntry" Text="{Binding ContactList.PhoneNumber, Mode=TwoWay}"/>
            <Entry x:Name="EmailEntry" Placeholder="EmailEntry" Text="{Binding ContactList.Email, Mode=TwoWay}"/>
            <!--<Button x:Name="SaveContact" Text="Save Contact" Clicked="OnSaveButtonClicked"/>-->
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Тогда здесь пользователь "изменит информацию о контакте". По завершении они возвращаются на предыдущую страницу. К сожалению, моя главная страница все еще показывает старую информацию на этикетках. Я даже могу снова перейти на страницу ContactEdit и увидеть мои измененные значения. Я не понимаю, почему привязка на моей главной странице не обновляется.

Я предполагаю, что допустил действительно очевидную ошибку, поскольку я все еще очень плохо знаком с MVVM и т. Д. c. Возможно, у меня неправильное представление о «привязке данных» и просто грубой передаче информации о времени между представлениями.

Спасибо за любые советы или указатели, которые вы можете дать!

...