我有两个DataTemplates根据当前的ViewModel进行切换。但是每当我切换我的ViewModel时,它似乎调用相应的View构造函数并在构造函数中调用InitializeComponent()调用,这意味着每当我切换DataTemplate时,它都会生成一个绑定的新视图到相应的DataTemplate 。我不确定为什么会发生这种情况但有没有办法在切换ViewModel时阻止创建新视图?
以下是位于我的MainView的DataTemplates。
<Window.Resources>
<DataTemplate DataType="{x:Type viewModels:FirstPanelViewModel}">
<views:FirstPanelView />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:SecondPanelViewModel}">
<views:SecondPanelView />
</DataTemplate>
</Window.Resources>
模板正在ContentControl中显示。
<ContentControl Grid.Row="1" Content="{Binding CurrentViewModel}" />
这是我的SecondPanelView,与我的FirstPanelView相同,非常简单。
public partial class FirstPanelView
{
public FirstPanelView()
{
InitializeComponent();
}
}
public partial class SecondPanelView
{
public SecondPanelView()
{
InitializeComponent();
}
}
我的Ioc确保我只生成SecondPanelView的一个实例
container.Register<IFirstPanelViewModel, FirstPanelViewModel>(new PerContainerLifetime())
container.Register<ISecondPanelViewModel, SecondPanelViewModel>(new PerContainerLifetime());
DataContext在每个视图中都受到自定义标记扩展的限制。
DataContext="{Binding Source={common:Locate}, Path=FirstPanelViewModel}"
DataContext="{Binding Source={common:Locate}, Path=SecondPanelViewModel}"
这只是调用相应ViewModel的GetInstance。
public IFirstViewModel FirstViewModel
{
get { return _container.GetInstance<IFirstPanelViewModel>(); }
}
public ISecondViewModel SecondViewModel
{
get { return _container.GetInstance<ISecondPanelViewModel>(); }
}
答案 0 :(得分:4)
这是一个老问题,但我也在努力解决这个问题。答案是将视图实例直接放在资源中,并将它们绑定到数据模板中的内容控件。如果这样做,视图只会实例化一次。
<?xml version="1.0" encoding="UTF-8"?>
<output>
<CMMD>
<parameters>
<task id="alt,1319575,1319623"/>
<action id="11310224"/>
</parameters>
</CMMD>
<CMMD>
<parameters>
<task id="1319667,mss2,ms,ms2"/>
<action id="11310281"/>
</parameters>
</CMMD>
<CMMD>
<parameters>
<task id="222,555,444"/>
<action id="333"/>
</parameters>
</CMMD>
</output>
答案 1 :(得分:0)
即使在扩展ContentControl之后,我也无法解决我的问题。我使用这种方法遇到的问题是ContentControl的依赖属性不是直接interfacable / overridable,这迫使我破解现有的依赖属性。此外,DataTemplate的初始化似乎比简单的ContentControl更深入。
所以我决定通过简单地切换他们的可见性来改变我的观看方式。这种方法对我有用,因为我基本上希望我的观点能够在后台保持自己的观点,并且随时准备在之前的状态下进行接口。