c # WPF Потоковое событие OnResponse для MainWindowViewModel из одноэлементного объекта - PullRequest
0 голосов
/ 29 июня 2011

Приветствую, мои умные друзья по программированию!

Я создал OnResponseEvent для объекта, который внедряется в мою модель представления через UnityContainer.

Из моего класса введенных объектов:

    public delegate void ResponseEventHandler(AbstractResponse response);

    public event ResponseEventHandler OnResponseEvent;

Constructor for MainWindowViewModel:

public MainWindowViewModel(ITrack track)
        {
            this._track = Track;
            track.OnResponseEvent += UpdateTrackResponseWindow;
        }

Создан делегат для обработки OnResponseEvent в моем MainWindowViewModel:

private delegate void HandleTrackResponseCallback(AbstractResponse message);

Поскольку OnResponseEvent отправляет сообщение, мне нужно интерпретировать сообщение в отдельном потоке и отобразить в списке.
Вот где я запутался. Если бы я использовал WinForms для написания этого приложения, я мог бы использовать следующий код, потому что WinForms знает о моем listBox:

 if (ListBox.InvokeRequired)
    {
        var d = new HandleTrackResponseCallback(UpdateTrackResponseWindow);
        Invoke(d, new object[] { message });
    }
    else
        lstTrackResponse.Text = Interpret(message);  //Interpret is a separate method

Однако я использую WPF, и мой класс MainWindowViewModel ничего не знает о моем listBox, который находится в представлении.

Может ли кто-нибудь предоставить пример кода, как я могу обработать OnResponseEvent в другом потоке в моем классе MainWindowViewModel?

Большое спасибо, любая помощь очень ценится.

1 Ответ

2 голосов
/ 29 июня 2011

Управление видом из модели представления противоречит основным архитектурным принципам MVVM. Даже если бы это не было существо, вызванное из другого потока, это все равно было бы неразумно.

В MVVM вы будете обрабатывать это так же, как любые другие данные, которые должны отображаться в представлении:

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

Что-то простое, как:

<TextBox Text="{Binding Response}"/>

Этот подход даже решает проблему потоков, потому что теперь вы обрабатываете проблемы параллелизма в модели представления, а не в представлении. Просто заблокируйте доступ к свойству, с которым TextBox.Text связан, пока вы изменяете его.

Как правило, MVVM избегает прямой зависимости модели представления от представления по нескольким причинам:

  • большая цель слабой связи между моделью вида и видом
  • возможность модульный тест модель просмотра без представления

Сначала это разделение может показаться неуклюжим и требует дополнительной работы (см. Выше), но оно действительно того стоит, и это то, что нам нужно сделать, чтобы воспользоваться преимуществами подхода MVVM.

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