Обновление 2010 06 12
Извлечение сущности в меньший образец - решение доступно здесь http://db.tt/v6r45a4
Теперь, похоже, проблема, связанная с элементом управления вкладкой:Когда контекст данных повторно применяется (нажмите кнопку), кажется, что все работает, как ожидалось.Привязки обновляются, но затем все привязки на активной вкладке нарушаются.
Вы можете убедиться в этом, выбрав любую вкладку и нажав кнопку, и вы увидите, что элементы управления на этой вкладке идут капутом.Добавил кучу операторов регистрации, как мой друг пришел к этому краткому описанию, и его исправление [Set DataContext = "{Binding}" также в элементе управления вкладками]
Но мы все еще не уверены, почему это происходиткак это происходит ...
TabControl Data Context now set to ReproTabItemBug.MainViewModel
TabPage [LeftTabPage] Data Context now set to ReproTabItemBug.LeftViewModel
System.Windows.Data Error: 40 : BindingExpression path error: 'MiddleProp' property not found on 'object' ''MainViewModel' (HashCode=50608417)'. BindingExpression:Path=MiddleProp; DataItem='MainViewModel' (HashCode=50608417); target element is 'TextBox' (Name='MiddleTabTextbox'); target property is 'Text' (type 'String')
TabPage [MiddleTabPage] Data Context now set to ReproTabItemBug.MiddleViewModel
Middle tab textbox text changed to 634272638824920423
TabPage [RightTabPage] Data Context now set to ReproTabItemBug.RightViewModel
Middle tab textbox text changed to
Предыдущий пост (Отказ от ответственности: Длинный пост впереди ... получите свой попкорн. Я потратил большую часть дняна этом ..)
Моя ViewModel состоит из трех POCO subViewModel.Каждый subVieModel имеет свойства, которые связаны в 3 разделах, упомянутых выше.Каждый subViewModel предоставляется как стандартное свойство .net get-only (без INotifyPropertyChanged)
В My View есть 3 раздела.В каждом разделе есть установщик DataContext примерно так ..
...
<TabItem x:Name="_tabPageForVM2" DataContext="{Binding PropReturningSubVM2}">
<!-- followed by UI Items that are data-bound to props inside this sub-viewmodel -->
</TabItem>
...
Итак, подведем итог
<MainView> <!--DataContext set programmmatically to an Instance Of MainViewModel) -->
<Control DataContext="{Binding PropReturningSubVM1}" >.. Section1 .. </Control>
<Control DataContext="{Binding PropReturningSubVM2}" >.. Section2 .. </Control>
<Control DataContext="{Binding PropReturningSubVM3}" >.. Section3 .. </Control>
</MainView>
Теперь вот загадочный бит.При обычном запуске я создаю экземпляр MainViewModel (в котором модели дочерних представлений передаются в его ctor).Свойства в окне просмотра подтверждают это.
Trace.WriteLine("Before setting datacontext");
mainView.DataContext = null;
mainView.DataContext = mainViewModel;
//mainView.Refresh();
Trace.WriteLine("After setting datacontext");
Все работает отлично.Теперь по независящим от меня причинам существует сценарий, когда пользовательский интерфейс отклоняется, но представление все еще находится в памяти.Таким образом, чтобы очистить его, когда он будет показан в следующий раз, я создаю новые экземпляры моей модели представления и повторно применяю текст данных (вызывая ту же процедуру инициализации, что и раньше). Однако, когда выполняется набор DataContext=mainViewModel
, я вижу связку связыванияошибки в окне вывода.Что интересно, так это то, что только привязки внутри одной вкладки (модель подвида) нарушены.Другие 2 модели подвидов работают правильно - без ошибок привязки.
System.Windows.Data Error: 40 : BindingExpression path error: 'RphGaugeMaxScale' property not found on 'object' ''MainViewModel' (HashCode=38546056)'. BindingExpression:Path=RphGaugeMaxScale; DataItem='MainViewModel' (HashCode=38546056); target element is 'Gauge' (Name='GaugeControl'); target property is 'MaxValue' (type 'Double')
System.Windows.Data Error: 40 : BindingExpression path error: 'RphGaugeMaxScale' property not found on 'object' ''MainViewModel' (HashCode=38546056)'. BindingExpression:Path=RphGaugeMaxScale; DataItem='MainViewModel' (HashCode=38546056); target element is 'Gauge' (Name='GaugeControl'); target property is 'MajorTickCount' (type 'Int32')
...
Свойства существуют в SubViewModel2, но вместо этого поиск использует MainViewModel.
Далее я добавил метод обновления вMainView (вызывается после повторного применения DataContext), который делает это
_tabPageForVM2.DataContext = null;
_tabPageForVM2.DataContext = mainVM.PropReturningSubVM2;
, и это решает проблему.
Что меня удивляет, так это
- , что особенного в этомsubVM2?Если он работает при первом назначении DataContext, почему он прерывается во второй раз?
- Я установил заголовок tabPage равным {Binding}, чтобы проверить, с чем он связан, и показывает «FullTypeNameOfSubVM2»,который указывает, что свойство DataContext вкладки устанавливается.Так почему же сломаны привязки?