TabControl会松开子控件

时间:2018-08-24 18:51:11

标签: c# wpf mvvm caliburn.micro caliburn

我目前正在为自己设计一个好玩的解决方案,为健身房创建锻炼计划。 Solution on Github

这是一个使用Caliburn.Micro的简单WPF解决方案,可以更轻松地获得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]" />

MainViewModel:

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

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

我已经找到了this question ...我能够找到的解决方案都适用于MVVM,但不适用于Caliburn.Micro,因此我真的不知道如何解决这个问题。 我已经尝试过Avalon基座,但无法使其与Caliburn绑定x:Name =“ Items”

的方式一起使用。

注意: 如果要使用我的解决方案重新创建Bug,则必须通过在“管理锻炼”选项卡中选择一个图像并单击“添加”来添加一些“锻炼”(您可以多次添加相同的“锻炼”)。 到目前为止,还没有完成任何错误处理或测试,因为这完全可以正常工作。我现在要验证该错误。

1 个答案:

答案 0 :(得分:0)

我发现了问题,但我仍然不明白,为什么这是一个问题。

给出:

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

tab控件偶尔会失去其子级。 如果我将一个新的ExerciseProviderViewModel传递给eacht 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)));
}

这没有问题。