TabControl丢失了子控件

问题描述 投票:-1回答:1

我目前正在为自己制定一个有趣的解决方案,为健身房制定锻炼计划。 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中以获得练习数据库的类型,以及稍后您应该为您的计划选择练习的数据库。

问题:在启动时一切看起来都不错,但是一旦我在Tabs之间切换,其中一个可能会因为某种原因而失去其子控件。

我已经尝试过以下方法:

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 dock,但是我无法使用Caliburn绑定x的方式:Name =“Items”

注意:如果要使用我的解决方案重新创建Bug,则必须通过在“管理练习”选项卡中选择图像并单击添加来添加一些“练习”(您可以多次添加相同的“练习”)。到目前为止,没有进行错误处理或测试,因为这是我要验证的状态,如果它可以工作的话。

c# wpf mvvm caliburn.micro caliburn
1个回答
0
投票

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

鉴于:

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

tabcontrol偶尔会失去孩子。如果我将一个新的ExerciseProviderViewModel传递给每个Items.Add()调用,则不会发生错误。因此,我将一个ExerciseProvider存储为成员,并将其传递给我想要添加的ViewModel。

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

这没有任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.