2014-10-02 3 views
0

У меня есть приложение для трейдинга MVVM.Почему новый вид не создается при создании нового ViewModel

MainView имеет два элемента управления вкладками - слева отображает коллекцию "workspaces", а справа отображает диаграммы отображения динамических данных.

Когда я создаю первый "chartviewmodel", правильная диаграмма появится в правой панели управления вкладкой, как и ожидалось. Когда я создаю еще "chartviewmodel" с разными данными, которые должны привести к другому графику, это не то, что происходит. Второй элемент табуляции является дубликатом первого с визуальной точки зрения. Элементы табуляции содержатся в наборе элементов, называемых: "chartspaces", и в режиме отладки я вижу каждую модель и, в свою очередь, имеет разные значения.

Кроме того, в режиме отладки я установил точку останова в методе "Initialize()" и, когда первый chartviewmodel создан, этот метод действительно вызван. Когда я создаю второй chartviewmodel, метод "Initialize()" не вызывается, поэтому на самом деле другое представление не создается ... но я не могу понять, почему.

My view/viewmodel's связаны между собой через DataTemplate с x:Shared="False" (пробовал его с этим параметром и без него). Я проследил конструктор chartviewmodel, чтобы убедиться, что он не получил никаких ошибок, и это не так.

В левой панели управления вкладками я могу создать несколько tradeviewmodel, и каждый результат будет выглядеть в другом виде ... другими словами, он ведет себя как ожидалось.

Мой XAML для правильного управления вкладки, по существу, такой же, как для левого с исключением "workspace" коллекции (слева использует "workspaces" право использует "chartspaces", так что я в недоумении относительно того, что может быть неправильно или как диагностировать эту проблему дальше

DataTemplate выглядит следующим образом:.

<DataTemplate x:Shared="False" DataType="{x:Type vm:ModelOptionChainViewModel}"> 
    <vw:DDDRiskChart /> 
</DataTemplate> 

В дальнейшем экспериментирования, я поставил вкладку элементы на левой стороне, а и нашел такую ​​же проблему, но если я выбрал не-динамические данные Покажите вкладку, затем одну из диаграмм DDD, они отображаются правильно. S o, прежде чем я выбрал диаграмму DDD, мне пришлось отобразить диаграмму, отличную от DDD, а затем диаграмму DDD для ее отображения.

Итак, перемещая элементы табуляции обратно в правую вкладку, я вставляю две диаграммы DDD, а затем кладу в таблицу без DDD (диаграмму DataVisualization). Я нашел такое же поведение ... если бы я выбрал диаграмму без DDD, а затем диаграмму DDD, она отобразится правильно. Если я просто чередую между двумя DDD-диаграммами, они оба будут отображать один и тот же график! Разве это не странно?

+0

Отправьте свой код здесь. –

+0

Имейте в виду, что ViewModel - это концепция, специфичная для приложения, которая не знает о представлениях (т. Е. Отключена). * вы * должны привязать этот ViewModel к вашему представлению вручную/явно. Мы * не можем * знать, если/как вы это делаете; поэтому укажите детали, если вы хотите, чтобы кто-то мог помочь. –

+0

Как вы показываете свой список детей? Модели? В ObservableCollection <>? –

ответ

0

Итак, для любого из вас, кто заботится ... проблема на самом деле связана с поведением TabControl. Irv Krivyakov имеет отличный проект кода с описанием (ссылка: http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization) , который описывает проблему И предоставляет класс поведения TabContent, который устраняет проблему. Суть проблемы связана с виртуализацией в TabControl. Вместо того, чтобы повторять его объяснения, см. Приведенную выше ссылку. Кроме того, см.: DataTemplate x:Shared=false has no impact on the view особенно последнее сообщение в этой ветке, где обсуждается поведение TabControl и DataTemplate. Мой исправление было: поведение TabContent использовать Irv Krivyakov и мой TabControl теперь выглядит следующим образом:

<DataTemplate x:Key="ChartspacesTemplate"> 
<TabControl 
    Name="chartTab" 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding}" 
    behaviours:TabContent.IsCached="True"  // THIS IS THE FIX!! 
    ItemTemplate="{StaticResource ChartTabItemTemplate}" 
    Margin="4" 
    /> 

Примечание: изменение одной строки. Теперь, когда я переключаю вкладки, отображаются правильные данные.

Смежные вопросы