Доброго всем времени суток!
Передо мной стоит следующая задача:
Необходимо переписать машину состояний для WPF, которая до этого была сделана при помощи WorkFlow. Основное условие такое, что вьюхи(xaml) должны грузиться динамически из файлов.
Кратко о моем решении:
Есть окно, в него помещен элемент типа Frame. Его свойство Content прибиндино к свойству типа Page CurrentPage у ViewModel. Соответственно DataContext`ом у Frame это мой ViewModel.
В конструкторе ViewModel создается экземпляр машины состояний, В которой запускает бесконечный цикл while в отдельном STA потоке Thread. Этот поток проверяет очередь переходов с определенной периодичностью. Как только он находит запись в очереди переходов происходит загрузка нового состояния. Вьюха гружу так:
using (var fs = new FileStream(ViewFilePath, FileMode.Open))
{
pageToLoad = XamlReader.Load(fs) as Page;
}
Тут никаких проблем. После удачной загрузки вьюхи, вызываем event onStateChanged во ViewModel. Где свойству CurrentPage присваивается значение newState.Page.
Вот тут и возникает проблема. При попытке отобразить новое окно возникает ошибка:
Exception:Thrown: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток." (System.InvalidOperationException)
A System.InvalidOperationException was thrown: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
Собственно вопрос в этом и заключается. Как побороть эту ошибку, чтобы он отобразил мне CurrentPage?
Хотя возможно в целом подход кривой и кто-то может поделиться более грамотным решением.
Спасибо за внимание. Очень надеюсь на вашу помощь.
Прилагаю исходники тестового проекта:
Тестовый проект