Ситуация
Главное окно и ContentControl
У меня есть MainWindow с HamburgerMenu слева. DataContext MainWindow - это MainViewModel.
В нем есть команды, определенные для переключения между моделями представления «дочерних видов», которые отображаются в центральной области MainWindow с помощью ContentControl. Команды связаны с HamburgerMenu для выполнения переключения модели представления. Они определены внутри конструктора MainViewModel следующим образом:
CmdOpenMethodView = new RelayCommand(p =>
{
if (MethodVM == null)
{
MethodVM = new MethodViewModel();
}
CurrentViewModel = MethodVM;
}, p => !(CurrentViewModel is MethodViewModel));
CmdOpenSettingsView = new RelayCommand(p =>
{
if (SettingsVM == null)
{
SettingsVM = new SettingsViewModel();
}
CurrentViewModel = SettingsVM;
}, p => !(CurrentViewModel is SettingsViewModel));
ContentControl связан со свойством CurrentViewModel (типа BaseViewModel), которое определено в MainViewModel.
MainWindow.xaml (без заголовок) выглядит следующим образом:
<Window.DataContext>
<ViewModels:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<HamburgerMenu:HamburgerMenu Grid.Column="0"
Background="#6080bc"
MenuIconColor="White"
SelectionIndicatorColor="White"
MenuItemForeground="White"
MaxWidth="130"
HorizontalAlignment="Left">
<HamburgerMenu:HamburgerMenuItem Text="Method"
SelectionCommand="{Binding CmdOpenMethodView}"/>
<HamburgerMenu:HamburgerMenuItem Text="Settings"
SelectionCommand="{Binding CmdOpenSettingsView}"/>
</HamburgerMenu:HamburgerMenu>
<ScrollViewer Grid.Column="2" VerticalScrollBarVisibility="Auto">
<ContentControl Content="{Binding CurrentViewModel}"/>
</ScrollViewer>
</Grid>
Соединение между дочерними моделями представления <-> настраивается в App.xaml следующим образом:
<Application.Resources>
<!--Wire the view models and views-->
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:MethodViewModel}">
<Views:MethodView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:SettingsViewModel}">
<Views:SettingsView />
</DataTemplate>
</Application.Resources>
Дочерние элементы управления
Таким образом, в центральной области MainWindow отображается либо MethodView, либо SettingsView.
MethodsView содержит ComboBox, который привязан к свойству CurrentMethod MethodViewModel, например:
<ComboBox DisplayMemberPath="Name"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding CurrentMethod,
UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding AllMethodsView}"
IsEnabled="{Binding IsMenuAllowed}"
Grid.Row="0" Grid.Column="1"/>
ItemsSource установлен в MethodViewModel.AllMethodsView, который имеет тип ListCollectionView. SelectedItem привязан к MethodViewModel.CurrentMethod моего пользовательского типа Method.
Проблема
При нажатии в MainMenu / HamburgerMenu, чтобы открыть представление настроек, открывается окно настроек.
При повторном щелчке, чтобы открыть представление методов, открывается представление методов, но комбинированный список забыл свой выбранный элемент.
При отладке MethodViewModel я вижу, что ListCollectionView.CurrentItem устанавливается в ноль, когда ContentView переключается на отображение SettingsView.
Как я могу предотвратить это?
Редактировать: Я добавил пример к GitHub , чтобы предоставить демонстрационное приложение.
Не уверен, что он собирается из коробки, но источник есть, и, возможно, у кого-нибудь есть идеи, как решить проблему?