Недавно я начал разрабатывать Xamarin и MVVM, и я столкнулся с проблемой, я действительно не знаю, как ее решить.
Я привязал свои события в View
к свойствам ICommand
в моем ViewModel
. Но эти события должны иметь возможность запускать, например, вызов DisplayAlert
или Navigation.PushAsync
.
Теперь я знаю, что есть некоторые обходные пути для этих проблем, но не стал бы ссылаться на объект Navigation
в ViewModel
, нарушая предполагаемое использование ViewModel
, что он ничего не знает о View
?
Я действительно хотел бы сохранить строгий, чистый шаблон MVVM, так как я могу этого добиться?
Редактировать
Спасибо за ответы. Я поискал еще немного и нашел несколько библиотек для Xamarin.forms
, которые были упомянуты в сообщении блога это, которые, похоже, помогают.
Я попробую призма, у которого есть Navigation Service
и Page Dialog Service
.
Редактировать 02
В противном случае вы можете использовать MessagingCenter, как упомянул @Julien.
Вопрос, который вы задаете, очень распространен в мире 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");
};
};
}
}
Надеюсь, это даст вам некоторые идеи ...
Привет, думаю эта ссылка будет полезна: softwareengineering.stackexchange.com/questions/120090/…