为什么不';当我创建新的ViewModel时,不会创建新的视图
本文关键字:创建 视图 ViewModel 为什么不 | 更新日期: 2023-09-27 18:25:19
我有一个MVVM交易应用程序。
MainView
有两个选项卡控件——左边一个显示"workspaces"
的集合,右边一个显示动态数据显示图表。
当我创建第一个"chartviewmodel"
时,正确的图表会按预期显示在右侧选项卡控件中。然后,当我用不同的数据创建另一个"chartviewmodel"
时,应该会产生不同的图表,但事实并非如此。从视觉角度来看,第二个选项卡项是第一个选项卡项的副本。选项卡项包含在一个名为:"chartspaces"
的项集合中,在调试模式下,我可以看到每个视图模型,实际上每个视图模型都有不同的值。
此外,在调试模式下,我在视图的"Initialize()"
方法上设置了一个断点,当创建第一个chartviewmodel
时,该方法确实会被调用。当我创建第二个chartviewmodel
时,"Initialize()"
方法没有被调用,所以实际上没有创建另一个视图。。。但我不明白为什么。
我的视图/视图模型通过DataTemplate
和x: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图表之间交替,它们将显示相同的图表!这不奇怪吗?
所以,对于任何关心。。。这个问题实际上与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"
/>
注:一行更改。现在,当我切换选项卡时,会显示正确的数据。