none
Работа с потоками в WPF RRS feed

  • Вопрос

  • Здравствуйте.

    Подскажите как решить следующиую задачу:\

    В WPF приложении я использую патеерн MVVM.

    В форме есть DataGrid который биндится на коллекцию в ViewModel.

    В ViewModel я создаю экземпляр SerialPort и подписываюсь на событие DataReceived. Это событие возникает в другом потоке, отличном от основного потока приложения.

    В этом событии мне надо добавить новый элемент в коллекцию к которой прибиндин грид.

    Во время добавления происходит ошибка: Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher.

    В винформ приложении я делал просто из кода формы this.Invoke, но в MVVM нет ссылки на форму.

    Как перенаправить вызов в основной поток?

    13 июля 2011 г. 13:10

Ответы

  • Может как-то так?

          Dispatcher.Invoke(new Action(()=>
    
            {
    
                //Тут делаем, то что нужно
    
            }));


    Передавайте ссылку на окно. И вызывайте Dispatcher окна. Хотя возможно есть и другое решение, не видя кода сложно, что-то сказать.


    • Помечено в качестве ответа Abolmasov Dmitry 14 июля 2011 г. 5:06
    13 июля 2011 г. 15:10
  • Решение оказалось простейшим:

    Надо объявить переменную в классе ViewModel типа Dispatcher, и проинициализировать ее в конструкторе _dispatcher = Dispatcher.CurrentDispatcher;

    А дальше в обработчике события уже использовать ее как показано выше.

    • Помечено в качестве ответа Abolmasov Dmitry 14 июля 2011 г. 7:57
    14 июля 2011 г. 5:47

Все ответы

  • Может как-то так?

          Dispatcher.Invoke(new Action(()=>
    
            {
    
                //Тут делаем, то что нужно
    
            }));


    Передавайте ссылку на окно. И вызывайте Dispatcher окна. Хотя возможно есть и другое решение, не видя кода сложно, что-то сказать.


    • Помечено в качестве ответа Abolmasov Dmitry 14 июля 2011 г. 5:06
    13 июля 2011 г. 15:10
  • Решение оказалось простейшим:

    Надо объявить переменную в классе ViewModel типа Dispatcher, и проинициализировать ее в конструкторе _dispatcher = Dispatcher.CurrentDispatcher;

    А дальше в обработчике события уже использовать ее как показано выше.

    • Помечено в качестве ответа Abolmasov Dmitry 14 июля 2011 г. 7:57
    14 июля 2011 г. 5:47
  • Вызвать инвок так можно. А как внтури инвока обращаться к сущностям потока дистпечера, если нет ссылки на само окно, содержащее эти сущности (а есть только ссылка на его диспетчер)?

    13 августа 2011 г. 14:35