Использование функций графического интерфейса пользователя для события (MVVM)

Недавно я начал разрабатывать Xamarin и MVVM, и я столкнулся с проблемой, я действительно не знаю, как ее решить.

Я привязал свои события в View к свойствам ICommand в моем ViewModel. Но эти события должны иметь возможность запускать, например, вызов DisplayAlert или Navigation.PushAsync.

Теперь я знаю, что есть некоторые обходные пути для этих проблем, но не стал бы ссылаться на объект Navigation в ViewModel, нарушая предполагаемое использование ViewModel, что он ничего не знает о View?

Я действительно хотел бы сохранить строгий, чистый шаблон MVVM, так как я могу этого добиться?

Редактировать

Спасибо за ответы. Я поискал еще немного и нашел несколько библиотек для Xamarin.forms, которые были упомянуты в сообщении блога это, которые, похоже, помогают.

Я попробую призма, у которого есть Navigation Service и Page Dialog Service.

Редактировать 02

В противном случае вы можете использовать MessagingCenter, как упомянул @Julien.

Привет, думаю эта ссылка будет полезна: softwareengineering.stackexchange.com/questions/120090/…

Stefan 01.05.2018 14:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вопрос, который вы задаете, очень распространен в мире MVVM, что превращает его в самоуверенную тему. Некоторые разработчики считают, что вы должны сначала перемещаться между вашими страницами / представлениями - V, другие считают, что вам следует сначала перемещаться между вашими ViewModels - VM. У обоих есть свои преимущества и недостатки, и в WWW есть много ресурсов по этому поводу.

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

Скорее всего, не будет серебряной пули, подходящей для разных типов проектов. Просто имейте это в виду.

Удачи!

Ответ принят как подходящий

@EvZ ответ хорош. Вы должны проверить общие практики MVVM ...

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

Вместо событий вы также можете использовать Xamarin MessagingCenter для подключения вашего представления к его ViewModel (ref: Документация Xamarin MessagingCenter.

то есть:

/// <summary>
/// My view model class
/// </summary>
public class MyVM : INotifyPropertyChanged
{
    // VM logic
    // ...

    // events
    private event EventHandler<string> OnRequestShowDialog;

    // calling event
    public void BusinessMethod()
    {
        // ...
        OnRequestShowDialog?.Invoke(this, "Business method completed successfully...");
    }}

/// <summary>
/// My page class
/// </summary>
public class MyPage : ContentPage
{
    public MyPage()
    {
        // New VM 
        BindingContextChanged += (sender, args) =>
        {
            // Connect to your VM's events here
            (this.BindingContext as MyVM).OnRequestShowDialog += (e, message) => {
            this.DisplayAlert("info", args, "ok");
        };
    };
}
}

Надеюсь, это даст вам некоторые идеи ...

Другие вопросы по теме