Привязка ComboBox - SelectedItem потерян после изменения ViewModel - PullRequest
0 голосов
/ 18 февраля 2020

Ситуация

Главное окно и 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 , чтобы предоставить демонстрационное приложение.

Не уверен, что он собирается из коробки, но источник есть, и, возможно, у кого-нибудь есть идеи, как решить проблему?

...