WPF MVVM-приложение - ICollectionView / Threading / Общие вопросы - PullRequest
1 голос
/ 05 января 2011

У меня есть несколько вопросов по созданию приложений 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, которые отвечают некоторым из этих требований. Однако я хочу понять, как достичь вышеизложенного с помощью встроенных функций.

Спасибо

Ответы [ 2 ]

1 голос
/ 05 января 2011

Если у вас есть ListViews и ComboBox, вам действительно стоит подумать о ObservableCollection<> для привязки к этим элементам управления. Добавление и удаление элементов из коллекции автоматически уведомит элемент управления об изменении свойства.

Если вы выполняете фоновую обработку, вы можете посмотреть на BackgroundWorker или DispatcherTimer для обработки обновлений пользовательского интерфейса. Они оба могут работать с потоком пользовательского интерфейса и могут быть безопасными для потоков.

0 голосов
/ 01 марта 2012

Чтобы получить выбранный элемент из поля со списком, откройте объект INotifyCollectionChanged, такой как ObservableCollection, и привяжите его к источнику элементов, затем создайте другое свойство для текущего элемента и привязав ComboBox.SelectedItem (или ComboBox.SelectedValue, если требуется) к нему.,Вам нужно будет управлять выбором при обновлении коллекции.

На первый взгляд, ICollectionView кажется очевидным выбором, но реализация WPF действительно навязывает вам какой-то многопоточный код, который вас не должен беспокоить.с.

Я недавно использовал ICollectionView и CollectionViewSource (для фильтрации) и разочаровался в том, как много проблем с диспетчером закралось. Сегодня я, вероятно, собираюсь вернуться к методу, который я описал выше.

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