Использование функциональности GUI для события (MVVM) - PullRequest
0 голосов
/ 01 мая 2018

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

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

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

Вместо событий, вы также можете использовать Xamarin MessagingCenter для подключения вашего View к его 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");
        };
    };
}
}

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

0 голосов
/ 01 мая 2018

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

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

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

Удачи!

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