Установка свойств "ViewModel" из класса "Model" - PullRequest
0 голосов
/ 08 января 2020

В настоящее время я работаю над проектом в Xamarin с использованием подхода MVVM. Я изучил основы из разных уроков на YouTube и официальной документации Xamarin. Тем не менее, до сих пор я никогда не видел пример, который обрабатывает этот конкретный вопрос.

Возможно, я неправильно понял некоторую часть того, как следует использовать шаблон MVVM, но если нет, я хотел бы услышать от кого-то иначе, если у них есть какое-то другое решение для этого.

У меня есть базовая c привязка между ViewModel (.cs) и View (.xaml).

Допустим, что «View» - это файл с именем Profile.xaml, и у нас есть:

<Label Text="{Binding Name}" />

, который привязан к «ViewModel», давайте вызовем это ProfileViewModel.cs, который имеет следующее свойство, а также реализует INotifyPropertyChanged:

public string Name {get; set;}

И, конечно, класс "Model", который связывает их вместе с установкой BindingContext (позволяет скажем, он реализует ContentView и должен называться Profile.xaml.cs):

private ProfileViewModel ViewModel;

public Profile() {
  BindingContext = ViewModel = new ProfileViewModel();
}

Это сортирует связь между «View» и «ViewModel».

Однако, когда я инициализирую «View» (Profile.xaml), который должен быть привязан к «ViewModel» (ProfileViewModel.cs), это делается посредством инициализации «Model» (Profile.xaml.cs), и я пока не нашел пример того, что показывает хорошую практику, как заполнить ViewModel уже существующими данными.

Как и в примере для этого вопроса, «Имя» может уже существовать в какой-либо базе данных. И здесь мы инициализируем весь профиль, выполнив следующее:

<Profile Name="Napoleon" />

Для этого классу "Модель" (Profile.xaml.cs) также необходимо иметь следующее: public string Name {get; set;}

И передать эту строку «ViewModel», когда установлен BindingContext:

BindingContext = new ProfileViewModel(){ 
  Name = this.Name 
}

Однако я сталкивался с ситуациями, когда такого рода уже существующие данные могут поступать асинхронно или после того, как профиль "Модель" был инициализирован. Это привело меня к следующему решению. Реализация свойства set, которое ссылается на соответствующее свойство в «ViewModel».

public string Name {
  get => ViewModel.Name;
  set => ViewModel.Name = value;
}

Как я уже сказал, это работает для меня, но меня действительно интересуют другие идеи, как это можно решить или, если у меня есть получил шаблон MVVM ужасно неправильно.

1 Ответ

0 голосов
/ 08 января 2020

Вы смешиваете элементы MVVM.

Profile.xaml и Profile.xaml.cs являются частичными объявлениями классов. Они работают вместе и компилируются в один файл. Это твоя точка зрения. Как правило, в вашем файле xaml.cs не должно быть logi c, но есть исключения из этого правила.

ProfileViewModel.cs - ваша модель представления. Это обрабатывает все бизнес-логики c и предоставляет свойства, к которым привязывается представление.

Client.cs будет примером модели. Обычно в модели существуют только публичные c свойства и бизнес-логики c. Пример:

public class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime BirthDate { get; set; }
}

В вашей ситуации вы использовали бы модель представления для выполнения веб-вызова и заполнения своей модели. тогда вы должны установить для своего свойства ViewModel.Name значение Model.Name и вызвать OnPropertyChanged(nameof(Name)) или любой другой метод INotifyPropertyChanged. Это скажет представлению, что Name изменился, и обновит его представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...