TabControl 会丢失子控件



我目前正在为自己制定一个有趣的解决方案,为健身房制定锻炼计划。 Github上的解决方案

这是一个简单的WPF解决方案,使用Caliburn.Micro来更轻松地获取MVVM模式的连接。

在我的主视图上,我有一个选项卡控件:

MainView.xaml:

<TabControl x:Name="Items" />

使用视图模型的以下代码:

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

我在 TabControl 中只显示了两个 ViewModels,一个用于管理练习并将其存储在 xml 中,以便拥有您的练习数据库,另一个稍后您应该能够为您的计划选择练习。

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

我已经尝试了以下方法:

MainView.xaml:

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

主视图模型:

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

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

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

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

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

鉴于:

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

选项卡控件偶尔会丢失其子控件。 如果我将一个新的 ExerciseProviderViewModel 传递到每个 Items.Add(( 调用中,则不会发生该错误。 因此,我存储了一个练习提供程序作为成员,并将这个传递给我想要添加的视图模型。

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

这没有任何问题。

最新更新