У меня есть несколько вопросов по созданию приложений WPF MVVM.
1) Я использую объекты ICollectionView для элементов управления с привязкой к данным, таких как ListView и ComboBox. Я обнаружил, что это был самый простой способ получить доступ / отслеживать выбранный элемент этих элементов управления. Каков наилучший способ заменить содержимое ICollectionView? В настоящее время я делаю это так:
private ICollectionView _files;
public ICollectionView Files {
get { return _files; }
}
void _service_GetFilesCompleted(IList<SomeFile> files) {
this.IsProcessing = false;
_files = CollectionViewSource.GetDefaultView(files);
_files.CurrentChanged += new EventHandler(FileSelectionChanged);
OnPropertyChanged("Files");
}
Я не знал, нужно ли заново подключать обработчик каждый раз, когда я обновляю список файлов?
2) Теперь, когда я обдумал это, мне начинает нравиться паттерн MVVM. Однако одна концепция, в которой я не совсем уверен, это то, как отправлять уведомления обратно в представление. В настоящее время я делаю это путем привязки к свойствам на моей ViewModel. Например, в приведенном выше коде у меня есть свойство IsProcessing, которое я использую, чтобы определить, отображать ли ProgressBar. Это рекомендуемый подход?
3) Исходя из 2), похоже, не существует стандартного способа обработки исключений в приложении MVVM. Одна мысль, которая у меня была, заключалась в том, чтобы в базовом классе ViewModel был один метод, который обрабатывал исключения. Затем я мог бы внедрить IMessagingService, который отвечал за передачу любых сообщений об ошибках. Конкретная реализация этого может использовать MessageBox.
4) У меня есть несколько задач, которые я хочу выполнять асинхронно. Вместо того, чтобы добавлять эту логику непосредственно в мой сервис, я создал сервис декоратора, который запускает базовые методы сервиса в новом потоке. Он предоставляет ряд событий, на которые моя ViewModel может подписаться. Я перечислил код ниже. Я понимаю, что BackgroundWorker - более безопасный вариант, но не знал, подходит ли он для одновременного запуска нескольких асинхронных задач?
public void BeginGetFiles()
{
ThreadStart thread = () => {
var result = _serviceClient.GetUserFiles(username, password);
GetFilesCompleted(result.Files);
};
new Thread(thread).Start();
}
Наконец, я понимаю, что существует ряд проектов на основе MVVM, которые отвечают некоторым из этих требований. Однако я хочу понять, как достичь вышеизложенного с помощью встроенных функций.
Спасибо