Модель MVFM WPF, взаимодействующая с ViewModel при загрузке данных - PullRequest
0 голосов
/ 02 апреля 2012

Хорошо, поэтому я пытаюсь приложить руку к программированию паттернов, чтобы улучшить свой набор навыков.Я конвертирую приложение Win Forms в WPF, используя шаблон MVVM.Приложение в основном представляет собой графический интерфейс для сеанса мэйнфрейма.Он перемещается по различным панелям на экране мэйнфрейма, собирая данные для возможного редактирования и обновления.Я полагаю, что я понял основные концепции MVVM ниже, но у меня есть вопрос.

Я построил (исчерпав 100 или около того точек данных) МОДЕЛЬ данных, которая представляет все свойства объекта, которым я буду манипулировать,Я также создал свойства прокси на VIEWMODEL, который реализует INPC для привязки на VIEW.Теперь из того, что я прочитал, бизнес-логика для сбора данных должна быть ответственностью МОДЕЛИ.VIEWMODEL очищает эти данные и представляет их VIEW, где они, наконец, отображаются.

Так что, похоже, все это работает, но вот в чем проблема:

[ПРОПУСТИТЕ ЗДЕСЬ ДЛЯ ВОПРОСА]

Если МОДЕЛЬ контролирует бизнес-логику и извлекает данныеКак продолжить обновление VIEW через VIEWMODEL, начиная с сеанса мэйнфрейма через серию различных панелей, в какой момент происходит извлечение данных.По сути, это своего рода индикатор прогресса получения данных МОДЕЛИ.Я знаю, что могу вызвать метод на МОДЕЛИ, а затем отчитаться, но как мне вызвать метод и отчитаться во время выполнения методов, когда МОДЕЛЬ не знает о существовании VIEWMODEL.Это, конечно, без реализации INPC непосредственно на МОДЕЛИ.

Спасибо за любую помощь,

Аарон Ван

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

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

Один из способов:

public enum MainframeLoadStage { StageOne, StageTwo, StageThree }

public class LoadingStageEventArgs : EventArgs {
     public MainframeLoadStage { get; set; }
}

class MyMainframeModel {
     public event EventHandler<LoadingStageEventArgs> StageLoaded;
}

Или, если вам нужны мелкозернистые данные для«Стадия» вашей загрузки:

public class MyMainframeModel {
    public event EventHandler<LoadingStageOneEventArgs> StageOneLoaded;
    public event EventHandler<LoadingStageTwoEventArgs> StageTwoLoaded;
}

В качестве альтернативы, если вы хотите, вы можете сообщить о состоянии одной операции на модели, передав обратный вызов вместе с вызовом:

public class MyMainframeModel {
    public void Load (Action<LoadingMessage> callback);
}

Более того, вы можете подумать об использовании Task Parallel Library (TPL) и использовать набор функций оттуда: http://msdn.microsoft.com/en-us/library/dd537609.aspx

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

0 голосов
/ 03 апреля 2012

Обычно ViewModel будет иметь операции для извлечения данных, а не модель объекта.Таким образом, ваша CustomerViewModel может иметь метод GetCustomers.

Также проверьте асинхронную CTP или, если вы используете Visual Studio 11, вам не нужна CTP, я полагаю.Новый асинхронный компонент позволяет очень легко выполнять асинхронный вызов и отправлять обновления индикатора прогресса, например, в потоке пользовательского интерфейса.

Асинхронное программирование с использованием асинхронного и Await http://msdn.microsoft.com/en-us/library/hh191443(v=vs.110).aspx

...