У меня есть два DataTemplates, которые переключаются в зависимости от текущего ViewModel. Однако всякий раз, когда я переключаю свой ViewModel, он, как представляется, вызывает соответствующий конструктор View и вызывает вызов InitializeComponent() внутри конструктора, а это означает, что всякий раз, когда я переключаю DataTemplate, он генерирует новое представление, привязанное к соответствующему DataTemplate. Я не уверен, почему это происходит, но есть ли способ предотвратить создание нового представления при переключении ViewModels?MVVM - datatemplate создает новый вид
Ниже приведены DataTemplates, расположенные в моем MainView.
<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}"
Это просто вызов GetInstance соответствующей ViewModel.
public IFirstViewModel FirstViewModel
{
get { return _container.GetInstance<IFirstPanelViewModel>(); }
}
public ISecondViewModel SecondViewModel
{
get { return _container.GetInstance<ISecondPanelViewModel>(); }
}
Это дизайн в WPF. Если представление выходит за пределы видимости, представление уничтожается и должно быть воссоздано, если его нужно снова отобразить. Это происходит, если вы используете первый подход ViewModel, a.k.a. DataTemplates. То же самое происходит с помощью TabControl со связанными исходными элементами и шаблонами данных. Несмотря на то, что ViewModel не воссоздается, это представление. Единственный способ обойти это - сделать контроль над тем, как создается представление. Это можно сделать в пользовательском элементе управления. См. [Здесь] (http://stackoverflow.com/questions/3877611/is-it-possible-to-cache-the-view-when-using-model-first-approach). – Michael
Вы можете попробовать [this] (http://stackoverflow.com/questions/9794151/stop-tabcontrol-from-recreating-its-children), но вместо этого расширив ContentControl. – Michael
Спасибо за это предложение. Я дам этот метод. – kotsumu