Xamarin Forms MVVM с актуальной моделью - PullRequest
0 голосов
/ 12 декабря 2018

Я довольно новичок в Xamarin и наткнулся на MVVM, и мне действительно нравится это как архитектурный паттерн.Тем не менее, я обнаружил, что большинство HowTo и учебных пособий касаются только стороны вещей VVM (т.е. View-ViewModel), вероятно, для простоты!?

Я хотел бы знать, как связь между ModelView и связанными с ним моделями происходит с использованием парадигмы INotifyPropertyChanged и других вещей.

Если я правильно понимаю, я бы лично поставил такие вещи, как обработка данных, хранение данных (коллекции), соединения БД и прочее.как это в модель.По крайней мере, так я бы поступил в старые добрые времена MVC.В моей голове возникают следующие вопросы:

  • Где я могу создать модель (ы) и как назначить их для ViewModels?
  • Как правильно подключить Model и ViewModel, чтобы обновления свойств распространялись и могли обрабатываться правильно?
  • Вы бы задали модель в качестве члена ViewModel?

В моем текущем примере я хотел бынравится реализовывать SensorModel, который предоставляет несколько сенсорных данных, на которые вышеупомянутые слои могут подписаться .Я хотел бы отправлять обновления всякий раз, когда новые данные датчика доступны для слоев выше;то есть ViewModel, например.

В принципе я имел в виду нечто подобное:

class Sensor
{
    int _id { get; set; }
    string _name { get; set; }
}

class SensorModel
{
    private List<Sensor> _sensors { get; set; }
    public void addSensor(Sensor s) ...
    public void removeSensor(Sensor s) ...
}

Есть ли у кого-нибудь ссылки на реальные / полные примеры MVVM, , включая * 1029?* связь между Model и ViewModel?

Любая помощь приветствуется.

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Я хотел бы знать, как происходит обмен данными между ModelView и связанными с ним моделями с использованием парадигмы INotifyPropertyChanged и других вещей.

Я думаю, что лучший способ создать связь вMVVM - это Центр сообщений.https://docs.microsoft.com/pt-br/xamarin/xamarin-forms/app-fundamentals/messaging-center

Он не связан с кодом устройства (датчика) для просмотра моделей ...

Ваши сообщения в этой модели - активные события, которые могут повлиять на ваши модели представления, а также на другие структуры.

Пример этого

По вашему мнению, используйте:

public void MessegingCenterInit()
    {
        #region Bluetooth

        MessagingCenter.Subscribe<string, string>("App", "Status_name", (sender, arg) =>
        {
            App.PVM.Name = $"{arg}";//using INotifyPropertyChanged and view model
            viewmodelMethod();//using only a viewmodel
         });
        #endregion
    }

, в вашей модели используйте:

  public string Name
        {
            get { return name; }
            set
            {
                name = value;
                App.PVM.Add_patient.AddCanExecuteChanged();//PVM is a viewmodel
                //The view model need to have INotifyPropertyChanged as a interface
           }
        }

В вашем конкретном коде (в общий метод или событие):

string new_name = John;
MessagingCenter.Send<string,string>("App","Status_name",new_name);

Есть несколько способов сделать это, это простой способ, вы можете попробовать использовать объекты как отправителя с меньшим количеством информации.

С уважением

0 голосов
/ 12 декабря 2018

Сам Xamarin дает действительно хороший пример со своим решением Master-Detail по умолчанию.

Просто создайте новое приложение Xamarin.Forms и выберите макет Master-Detail.Он включает в себя несколько видов, ViewModel (с BaseVIewModel) и некоторые классы данных MockUp.Для начала просто посмотрите вокруг:)

0 голосов
/ 12 декабря 2018

Использование последних стабильных форм Xamarin

МОДЕЛЕЙ

В проекте создайте папку Models

Для хранения данных я обычно использую SQLite или временное хранилище:

class DataStore
{
    public static List<SensorModel> SensorStore { get; set; }
}

Создайте SensorModel модель

class SensorModel
{
    internal int Id { get; set; }
    internal string Sensor { get; set; }
}

VIEWMODELS

В проекте создайте папку ViewModels

Создайте SensorVM viewmodel

class SensorVM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public System.Windows.Input.ICommand StartCommand { get; set; }

    public string SensorName { get; set; }

    public SensorVM()
    {
        DataStore.SensorStore = new List<SensorModel>();
        StartCommand = new Xamarin.Forms.Command(StartSubmit);
    }

    private void StartSubmit(object paramter)
    {
        var sensor = new SensorModel()
        {
            Id = 1,
            Sensor = SensorName
        };

        AddSensor(sensor);
    }

    public void AddSensor(SensorModel sensor)
    {
        //do something
        DataStore.SensorStore.Add(sensor);
    }
}

VIEWS

В проекте создайте папку Views

Создайте Sensor.xaml view

<ContentPage.Content>
    <StackLayout Spacing="10" Orientation="Vertical">
        <Entry Text="{Binding SensorName}"  />
        <Button Command="{Binding StartCommand}" Text="Start" />
    </StackLayout>
</ContentPage.Content>

В коде позади:

 [XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Sensor : ContentPage
{
    SensorVM vm;
    public Sensor()
    {
        InitializeComponent();

        BindingContext = vm = new SensorVM();
    }
}

Надеюсь, что поможет.

0 голосов
/ 12 декабря 2018

Почти во всех случаях нет связи между Model и ViewModel, и очень редко существует связь между Model и View.Если вам необходимо установить связь между Model и ViewModel, очень вероятно, что вы делаете что-то не так.

Чтобы объяснить, ваша модель обычно описывает некую сущность, например, у вас есть класс Cat:

public class Cat
{
    public string Color {get; set;}
}

Обычно он используется в ViewModel как поле или как коллекция, например:

public class CatsViewModel
{
   public List<Cat> Cats {get; set;}
}

Кошка не может быть в состоянии обновиться сама по себе, если она обновляется, это делается либо связываниемс представлением или где-то из ViewModel.

Итак, у вас есть некоторые архитектурные проблемы в вашем приложении, я думаю.

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