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