【问题标题】:TabControl looses child controlsTabControl 失去子控件
【发布时间】: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&lt;Screen&gt;.Collection.OneActive?您无需自行切换项目,由 Caliburn Micro 为您处理。它将根据需要激活和停用您的标签。如果您在this 页面搜索TabControl,它有一个示例说明如何执行此操作。

标签: c# wpf mvvm caliburn.micro caliburn


【解决方案1】:

我找到了问题,但我还是不明白,为什么它是一个问题。

给定:

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

tabcontrol 偶尔会丢失它的子控件。 如果我将新的 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)));
}

这没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多