为什么在创建新的ViewModel时不会创建新的View

时间:2014-10-02 18:58:21

标签: c# wpf mvvm

我有一个MVVM交易应用程序。

MainView有两个标签控件 - 左边一个显示"workspaces"的集合,右边一个显示动态数据显示图表。

当我创建第一个"chartviewmodel"时,正确的图表会出现在预期的右侧标签控件中。 然后,当我创建另一个"chartviewmodel",其中包含不同的数据,这些数据应该会产生不同的图表,但事实并非如此。从视觉角度看,第二个标签项是第一个标签项的副本。选项卡项包含在名为"chartspaces"的项集合中,在调试模式下,我可以看到每个视图模型,实际上每个都有不同的值。

此外,在调试模式下,我在视图的"Initialize()"方法上放置了断点,并且在创建第一个chartviewmodel时,确实会调用该方法。当我然后创建第二个chartviewmodel时,"Initialize()"方法没有被调用,所以事实上另一个视图没有被创建......但是我无法弄清楚原因。

我的观看/视图模型通过DataTemplatex:Shared="False"绑定在一起(尝试使用和不使用此参数)。我已经通过chartviewmodel的构造函数进行了跟踪,以确保它没有出现任何错误,但事实并非如此。

在最左边的标签控件上,我可以创建多个tradeviewmodel,每个都会生成不同的视图...换句话说,它的行为与预期一致。

正确的标签控件的我的XAML与左侧的标签控件基本相同,但"workspace"集合除外(左侧使用"workspaces"正确使用"chartspaces"所以我在关于可能出现什么问题或如何进一步诊断这个问题的损失。

datatemplate看起来像:

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

在进一步的实验中,我将标签项放在左侧而发现了同样的问题,但是如果我选择了非动态数据显示标签项,然后选择其中一个DDD图表,它们就会正确显示。因此,在我选择DDD图表之前,我必须显示非DDD图表,然后显示DDD图表。

因此,将标签项移回右侧标签控件,我将两个DDD图表放入,然后放入非DDD图表(DataVisualization图表)。我发现了相同的行为...如果我选择非DDD图表然后选择DDD图表,它会正确显示。如果我只是在两个DDD图表之间交替,它们将显示相同的图形!那不奇怪吗?

1 个答案:

答案 0 :(得分: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行为。 我的修复是: 使用Irv Krivyakov的TabContent行为,我的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"
  />

注意:一行更改。现在当我切换标签时,显示正确的数据。