Моя цель в этом практическом приложении - открыть «Редактировать страницу контактов», а затем вернуть данные, которые будут отображаться на главной странице.
В настоящее время я могу передать контекст привязки в Страница 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. Возможно, у меня неправильное представление о «привязке данных» и просто грубой передаче информации о времени между представлениями.
Спасибо за любые советы или указатели, которые вы можете дать!