为什么不';当我创建新的ViewModel时,不会创建新的视图

本文关键字:创建 视图 ViewModel 为什么不 | 更新日期: 2023-09-27 18:25:19

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

MainView有两个选项卡控件——左边一个显示"workspaces"的集合,右边一个显示动态数据显示图表。

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

此外,在调试模式下,我在视图的"Initialize()"方法上设置了一个断点,当创建第一个chartviewmodel时,该方法确实会被调用。当我创建第二个chartviewmodel时,"Initialize()"方法没有被调用,所以实际上没有创建另一个视图。。。但我不明白为什么。

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

在最左边的选项卡控件上,我可以创建多个tradeviewmodel,每个结果都在不同的视图中。。。换句话说,它的行为正如预期的那样。

除了"workspace"集合(左使用"workspaces"右使用"chartspaces",所以我不知道可能出了什么问题,也不知道如何进一步诊断这个问题

数据模板看起来像:

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

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

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

为什么不';当我创建新的ViewModel时,不会创建新的视图

所以,对于任何关心。。。这个问题实际上与TabControl行为有关。Irv Krivyakov有一个优秀的代码项目和描述(链接:http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization)它描述了问题,并提供了一个TabContent行为类来消除问题。问题的关键在于TabControl中的虚拟化。与其重复他的解释,不如查看上面的链接。另请参阅:DataTemplate x:Shared=false对视图没有影响特别是关于该线程的最后一篇文章,它讨论了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"
  />

注:一行更改。现在,当我切换选项卡时,会显示正确的数据。