TabControl 失去子控件

TabControl looses child controls

我目前正在为自己制定一个仅供娱乐的解决方案,为健身房制定锻炼计划。 Solution on 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));
    }

我在 TabControl 中只显示了两个 ViewModel,一个用于管理练习并将它们存储在 xml 中以创建一个练习数据库,另一个用于您稍后可以为您的练习选择练习计划。

问题: 在启动时一切看起来都很好,但是一旦我在选项卡之间切换,其中一个可能会出于某种原因失去其子控件。

我已经尝试过以下方法:

MainView.xaml:

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

主视图模型:

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

这使得错误发生的频率降低,但它仍然存在。

我已经找到 this question ...我能找到的解决方案都适用于 MVVM,但不适用于 Caliburn.Micro,所以我真的没有任何想法,如何解决这个。 我试过 Avalon dock,但我无法让它与 Caliburn 绑定方式一起工作 x:Name="Items"

注意: 如果你想使用我的解决方案重新创建 Bug,你必须通过在 "Manage Exercise" 选项卡中选择一个图像并单击添加来添加一些 "Exercises"(你可以多次添加相同的 "Exercise") . 到目前为止还没有进行任何错误处理或测试,因为这是我想要验证的状态,如果它能正常工作的话。

我发现了问题,但我还是不明白,为什么它是一个问题。

鉴于:

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)));
}

这没有任何问题。