Проблема не в WPF, а в том, что я использовал MEF в качестве контейнера композиции. Свойство изменяет порядок импорта классов, и ядро ViewModel, отвечающее за MainWIndow, назначается сначала всем представлениям, после чего назначается правильный. Когда контекст данных обновляется, все привязки обновляются, поэтому приложение работает.
edit и теперь я нашел для этого полную причину.
SmartObservableCollection
принимает параметр Action<Action>>
для выполнения на CollectionChanged
событиях, это необходимо из-за того, что большинство моих коллекций обновляется многопоточным способом, но события должны выполняться в потоке GUI, иначе вы получит исключение.
Для этого мои Виды выставляют Dispatcher.Invoke()
и Dispatcher.BeginInvoke()
как методы, которые я затем предоставляю коллекции.
При запуске DataContexts назначаются в базовом классе ViewModel
следующими строками:
Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate()
{
view.DataContext = this;
});
У кого уже есть идея?
Причиной такого подлога стал тот простой факт, что я добавил в коллекцию метод Dispatcher.Invoke()
вместо Dispatcher.BeginInvoke()
. Делая это (и факт, что это использовалось в MainWindowViewModel
), он выполнялся до того, как любой DataContexts
был назначен другому ViewModels
.
Теперь, следующий шаг происходит - механизм WPF пытается привязать данные в вложенных представлениях. Поскольку DataContext
равно null
, механизм привязки перемещается вверх по визуальному дереву, пока не найдет набор DataContext, в этом случае первый набор DataContext находится в MainWindowView
, и это MainWindowViewModel
. Теперь, после завершения сбора, все остальные действия вызываются и DataContexts назначаются соответствующим образом, таким образом, повторно выполняется механизм привязки, который находит ненулевой DataContext во вложенных представлениях и правильно связывается.