【发布时间】:2019-01-31 06:35:35
【问题描述】:
我目前正在为自己制定一个有趣的解决方案,为健身房制定锻炼计划。 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]" />
主视图模型:
public void Reload()
{
_exerciseProviderViewModel = new ExerciseProviderViewModel();
Items.Refresh();
DisplayName = "Plan2Fit";
}
这会减少错误发生的频率,但它仍然存在。
我已经找到this question ...我能找到的解决方案都适用于 MVVM,但不适用于 Caliburn.Micro,所以我真的没有任何想法,如何解决这个问题。 我已经尝试过 Avalon 坞站,但我无法让它与 Caliburn 绑定 x:Name="Items"
的方式一起使用注意: 如果您想使用我的解决方案重新创建错误,您必须通过在“管理练习”选项卡中选择一个图像并单击添加来添加一些“练习”(您可以多次添加相同的“练习”)。 到目前为止,还没有进行任何错误处理或测试,因为这是我想要验证的状态,如果它可以工作的话。
【问题讨论】:
-
MainViewModel是否继承自Conductor<Screen>.Collection.OneActive?您无需自行切换项目,由 Caliburn Micro 为您处理。它将根据需要激活和停用您的标签。如果您在this 页面搜索TabControl,它有一个示例说明如何执行此操作。
标签: c# wpf mvvm caliburn.micro caliburn