класса участвуют:Обновление детей Модельное от родителей, воспитывающих событий
- Классический MVVM как контейнер для контроля детей.
- Детский контроль со своей собственной моделью просмотра (определенная кнопка).
- BackgroundWorker опрос через сокет удаленного хоста.
Поведение:
- Основное применение начинается загрузка Дети управления из списка XML. Каждый ребенок имеет и обработчик события обновления в родительском представлении Модель (мы называем это моделью основного вида), которая обновляет свойство дочернего элемента .
- Main ViewModel запускает BackgroundWorker
- BackgroundWorker вызывает метод Socket и использует обратный вызов ViewModel для ответа.
- Изменения в обратном вызове Основные свойства ViewModel.
Поскольку здесь работает отлично, но потом:
- Обновленное свойство создает событие в наборе и дети обработчиков начать с их собственным обновлением собственности.
- При обновлении исключение возникает:
Вызывающий поток не может получить доступ к этому объекту, потому что другой нить владеет.
Через несколько секунд кнопки обновляются. Я думаю, потому что поток пользовательского интерфейса снова берет управление и обновляет элементы управления. Но есть ли лучший способ справиться с этим?
Да, спасибо, это ясно. Но в моем наборе свойств я поднимаю событие, а не прямое обновление свойств. Поскольку он работает для модели родительского представления, становится ясно, что обработчик событий в модели дочернего представления должен повторно присоединиться к потоку пользовательского интерфейса. Но есть ли лучший способ разработать его без трюка Dispatcher? –
Я бы не согласился с тем, что модели просмотра ребенка должны заботиться о маршалинге. Да, именно там он взрывается из-за доступа к управлению, но основная модель обзора - это то, что знает о фоновом потоке, поэтому он должен отвечать за маршалинг. Потребители вашей основной модели не должны знать о ее реализации. Единственный способ сделать это - включить основной опрос фонового потока, но этот вид отрицает его смысл. – GazTheDestroyer
Я отмечаю это как ответ, потому что в настоящее время я использую его и, кажется, самое быстрое решение. –