1

Я разрабатываю приложение, которое будет доступно для Windows Phone 8 и Windows Store. Чтобы уменьшить избыточность, я использую портативную библиотеку классов (PCL), и, кроме того, я пытаюсь применить шаблон MVVM с помощью инструмента MVVM Light PCL Toolkit. ViewModels помещаются в PCL и напрямую связаны с XAML на страницах приложений.Использование MessageDialog/MessageBox с портативной библиотекой классов и MVVM Light

Когда данные получены без ошибок, все работает нормально. Но я не знаю, как вернуть сообщение об исключениях/ошибках в приложение, когда происходят ошибки.

Внутри приложения Windows Store ошибки приложения отображаются как MessageDialog, в то время как приложение Wp8 будет использовать класс MessageBox. Очевидно, что PCL не знает ни одного из этих классов. То, что я не получаю, - это узнать, возникла ли в ViewModel ошибка и как получить сообщение внутри приложения. Возможно ли это, когда ViewModels связаны внутри XAML?

Код в ViewModel (внутри PCL) выглядит следующим образом:

DataService.Authenticate((token, error) => 
{ 
    if (error != null) 
    { 
     // This is, obviously, not going to work. 
     MessageBox.Show(error.Message); 
     return; 
     } 

    Token = token; 
}); 

Так что я должен сохранить ошибка как-то и пусть сам App знать произошла ошибка , а затем вызовите соответствующий способ отображения ошибки пользователю.

В настоящее время я думаю о чем-то вроде определения свойства Error внутри BaseViewModel и заполняет его, когда возникают ошибки в ViewModel. Затем, в CodeBehind на страницах, сообщите им о текущем ViewModel и привяжите событие PropertyChanged к этому Свойству Error. Но я еще не смог его реализовать, поэтому я не знаю, правильно ли это подходит.

Должен ли я отказаться от идеи связать ViewModels внутри XAML, и вместо этого я должен инициализировать их внутри страниц Codebehind?

ответ

0

Ваш инстинкт верный, но есть несколько способов обойти это.

Прежде всего, вы можете использовать библиотеку сообщений Mvvm, которая позволит вашим ViewModel отправлять сообщения прямо на ваш просмотр. Затем ваш вид может обрабатывать его любым способом, включая, но не ограничиваясь, использование MessageDialog.

Во-вторых, вы также можете создать функцию или действие (вероятно, первое) в своем ViewModelLocator для ShowMessageDialog. Эта функция, скорее всего, займет string и вернет Task. Затем, после первоначальной инициализации вашего ViewModelLocator, вы можете ввести код ShowMessageDialog. Затем ваш ViewModels может использовать любую платформу MessageDialogs, которая им нравится.

Ex:

Примечание: Этот код использует библиотеку BCL ASync, которые доступны в NuGet. Они отлично работают в PCL.

ViewModelLocator:

public static Func<string, Task> ShowMessageDialog { get; set; } 

App.xaml.CS:

ViewModelLocator.ShowMessageDialog = (message) => 
    { 
     // For Windows Phone 
     return TaskFactory.StartNew(() => MessageBox.Show(message)); 

     // For Windows 8 
     MessageDialog md = new MessageDialog(message); 
     return md.ShowAsync().AsTask(); 
    }; 

ViewModel:

await ViewModelLocator.ShowMessageDialog("This is my message."); 

Вторичный Примечание: md.ShowAsync().AsTask();должен быть запущен на тему UI. Это означает, что вам придется вызвать его через диспетчер в случае, если вы выполняете его в задаче асинхронно. Это возможно с помощью аналогичного метода ввода использования CoreDispatcher приложения с помощью метода RunAsync.

Это означает, что вы можете на любой платформе (Windows 8 и Windows Phone, показанной выше) вставлять любую систему сообщений, которую вы хотите, и использовать ее в своем PCL.

Я бы сказал, что гораздо проще сделать первый предложенный мной метод, так как это то, для чего оно предназначено, но версия метода функций определенно полезна время от времени.

+0

Спасибо, это помогло. В моей текущей реализации теперь используются интерфейсы для настроек, обмена сообщениями и т. Д., Которые находятся внутри PCL. Затем, внутри проекта W8/WP8, я реализую их для своей платформы и автоматически вставляю их в свою ViewModelBase. Однако я посмотрю на сообщения MVVM Lights. После первого быстрого просмотра может отсутствовать возможность использовать особенности платформы, такие как WP8 MessageBoxButton, но я могу что-то упустить. – hmpf

Смежные вопросы