TabControl теряет дочерние элементы управления - PullRequest
0 голосов
/ 24 августа 2018

В настоящее время я работаю над забавным решением для себя, чтобы создать планы тренировок для спортзала. Решение на Github

Это простое решение WPF, использующее Caliburn.Micro для упрощения получения соединений для шаблона MVVM.

В моем MainView у меня есть TabControl:

MainView.xaml:

<TabControl x:Name="Items" />

Со следующим кодом для ViewModel:

 public MainViewModel()
    {     
      DisplayName = "Plan2Fit";
      Items.Add(new CreatePlanViewModel(_exerciseProviderViewModel));
      Items.Add(new ExerciseManagementViewModel(_exerciseProviderViewModel));
    }

У меня только две ViewModels, отображаемые в TabControl, один для управления упражнениями исохраните их в формате xml, чтобы иметь базу данных ваших упражнений и базу данных, в которой вы впоследствии сможете выбирать упражнения для своего плана.

Проблема: При запуске все выглядит хорошо, но каккак только я переключаюсь между вкладками, одна из них может потерять свой дочерний элемент управления по любой причине.

Я уже пробовал следующее:

MainView.xaml:

<TabControl x:Name="Items"  cal:Message.Attach="[Event SelectionChanged] = [Action Reload]" />

MainViewModel:

public void Reload()
{
  _exerciseProviderViewModel = new ExerciseProviderViewModel();
  Items.Refresh();
  DisplayName = "Plan2Fit";
}

Это делает ошибку реже, но она все еще существует.

Я уже нашел этот вопрос ... решения, которые яудалось найти все работают с МVVM, но не с Caliburn.Micro, так что я действительно не имею никакой идеи, как решить эту проблему.Я пробовал док-станцию ​​Avalon, но мне не удалось заставить его работать с привязкой Caliburn x: Name = "Items"

Примечание. Если вы хотите воссоздать ошибку с помощью моего решения, у вас естьЧтобы добавить «Упражнения», выберите изображение на вкладке «Управление упражнениями» и нажмите «Добавить» (Вы можете добавить одно и то же «Упражнение» несколько раз).Пока нет обработки ошибок или тестирования, так как это в состоянии, в котором я хочу проверить, если оно вообще работает.

1 Ответ

0 голосов
/ 30 августа 2018

Я нашел проблему, но до сих пор не понимаю, почему это вообще проблема.

Учитывая:

public MainViewModel()
{     
  DisplayName = "Plan2Fit";
  Items.Add(new CreatePlanViewModel(_exerciseProviderViewModel));
  Items.Add(new ExerciseManagementViewModel(_exerciseProviderViewModel));
}

Tabcontrol иногда теряет своих потомков.Если я передам новый ExerciseProviderViewModel в каждый вызов Items.Add (), ошибка не возникнет.Таким образом, я сохранил ExerciseProvider в качестве члена и передал его в мои ViewModels, которые я хочу добавить.

 public MainViewModel()
{
  _exerciseProvider = new ExerciseProvider(new DCSerializer<List<Exercise>>());
  DisplayName = "Plan2Fit";
  ActivateItem(new CreatePlanViewModel(new ExerciseProviderViewModel(_exerciseProvider)));
  ActivateItem(new ExerciseManagementViewModel(new ExerciseProviderViewModel(_exerciseProvider)));
}

Это работает без проблем.

...