Может ли кто-нибудь объяснить, какие преимущества предоставляет среда MVVM, такая как ReactiveUI или MVVM Light, для приложения Xamarin.Forms? мы можем реализовать INotifyPropertyChanged в наших моделях просмотра без использования какой-либо из этих платформ. Я что-то упускаю?
Платформа MVVM для Xamarin.Forms
- Если INotifyPropertyChanged — это все, что вам нужно, то это принесет вам пользу. Эти фреймворки обычно содержат несколько хороших инструментов, таких как DI, автоматическая загрузка/привязка и многое другое. Они просто немного облегчают жизнь. 30.12.2015
Ответы:
Я автор небольшого фреймворка MVVM для Xamarin.Forms (https://github.com/daniel-luberda/DLToolkit.PageFactory). Я попытаюсь указать некоторые преимущества его использования, поскольку некоторые функции являются общими и для других фреймворков:
- Готовая к использованию реализация
INotifyPropertyChanged
(просто наследуется отBaseViewModel
илиBaseModel
) - Навигация, ориентированная на ViewModel (вы можете переместить логику навигации для просмотра моделей)
- Встроенный обмен сообщениями для простой передачи данных/аргументов между страницами или моделями просмотра
- Кэширование и повторное использование страниц (улучшение пользовательского интерфейса за счет повторного использования представлений/страниц)
- Каждая страница имеет доступ к типизированному экземпляру ViewModel, который автоматически создается и подключается к BindingContext.
Эти функции различаются в зависимости от библиотеки. Некоторые из более продвинутых сред MVVM предлагают вам возможность перенести весь ваш проект на другие платформы/SDK, поскольку они поддерживают несколько платформ. Это может быть хорошей сделкой для более крупных проектов.
Пример кода для иллюстрации некоторых функций (код вызывается из ViewModel):
PageFactory.GetPageFromCache<SecondPageModel>()
.ResetPageModel()
.SendActionToPageModel((model) => { model.Message = "Hello World!"; })
.PushPage();
В MVVM Framework есть нечто большее, чем просто INotifyPropertyChanged
. Чтобы привести только пару примеров, есть:
- RelayCommand — класс, который обеспечивает реализацию интерфейса
ICommand
и позволяет привязать делегата к представлению. Полезно для кнопок - EventToCommand — позволяет привязать событие к команде в вашей модели представления. Вместо того, чтобы использовать код позади для
UIElement Events
Это всего лишь два класса, предоставляемые MVVM Framework, например MVVMLight
.
Использование MVVMLight означает, что вам не нужно реализовывать INotifyPropertyChanged
в каждом проекте, вы просто убедитесь, что ваш ViewModel
наследуется от ViewModelBase
, и вам также не нужно писать свою собственную реализацию в каждом проекте для двух упомянутых выше классов.
И последнее, что следует упомянуть, это то, что вы также можете установить фрагменты кода для MVVMLight
. Это означает, что код пишется ДАЖЕ быстрее!
Например, если вы хотите, чтобы свойство, которое вызывает свойство, также было изменено, просто используйте фрагмент свойства mvvmlight. Точно так же, если вам нужно свойство RelayCommand
, вы можете просто использовать фрагмент mvvmlight RelayCommand
Архитектурный шаблон Model-View-ViewModel (MVVM) был изобретен с учетом XAML. Шаблон обеспечивает отделение пользовательского интерфейса XAML (представления) от базовых данных (модели) с помощью класса, который служит посредником между представлением и моделью (представление). View и ViewModel часто связаны через привязки данных, определенные в файле XAML. BindingContext для представления обычно является экземпляром ViewModel. Нажмите здесь, чтобы просмотреть дополнительные сведения и пример кода.< /а>
Вам не нужно использовать ReactiveUI или MVVM Light, вы можете просто использовать интерфейс INotifyPropertyChanged, чтобы уведомить клиентов об изменении значения свойства. Ниже вы можете увидеть мой код класса ViewModelBase, надеюсь, что это поможет вам;
public class ViewModelBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
В моей ViewModel вот как я наследую ViewModelBase и как я создаю свое свойство;
public class ImageButtonViewModel : ViewModelBase
{
// ...
private string header;
public string Header
{
get
{
return header;
}
set
{
header = value;
OnPropertyChanged();
}
}
// ...
}
Я успешно использую Askaiser.Mobile.Pillar, и Я не вижу ничего плохого, я все еще изучаю, но это стало отличным кандидатом для моих проектов. документ
Надеюсь, я помог.
Приветствие
Простая истина заключается в том, что MVVM Frameworks (и их IOC-контейнеры) — это кратчайший путь для экономии вашего времени. Они приходятся на чрезвычайные расходы:
Они вызывают упрощенное согласование между представлениями, моделями представлений и моделями. Только одно может действительно принадлежать другому. Это не «IOC» — это жестко закодированное назначение, основанное на соглашении об именах файлов, например:
Главная страница
MainViewModel
ГлавнаяМодель
В реальном сценарии внедрения любое количество моделей может обслуживать любое количество моделей представлений при условии, что они реализуют надлежащий интерфейс. Кроме того, любое количество моделей представлений может обслуживать любое количество представлений, если эти модели представлений поддерживают интерфейс(ы) представлений.
Платформы MVVM создают классы с помощью приема отражения с использованием строкового префикса. В предыдущем примере строка «Main» позволяет нам найти страницу, модель представления и модель. Но это не переход от одной модели к другой. Это строка для просмотра навигации по модели.
Фреймворки создают классы с помощью Activator.CreateInstance, что приводит к хаосу в компоновщике времени компиляции.
Инфраструктуры создаются с использованием гипер-упрощенной логики параметров конструктора. Современные программы используют создание экземпляров как форму контроля. В этих рамках нет реального контроля.
Полный код этих замечаний находится по адресу https://github.com/marcusts/xamarin-forms-annoyances. См. решение под названием MvvmAntipattern.sln.
На сайте GitHub также есть ссылки на более подробное обсуждение этой темы.