【问题标题】:simple way to switch Viewmodels/Views in Caliburn.micro在 Caliburn.micro 中切换 Viewmodels/Views 的简单方法
【发布时间】:2012-10-23 05:18:15
【问题描述】:

几天前我问过this question,但答案让我更加困惑。所以我会问一个更简单的问题:

(我使用的是 Caliburn.Micro,这是一个 WPF 应用程序)。假设您有一个 MainView/MainViewModel,它具有子 AView/AViewModel 和 BView/BViewModel。您的 MainView 是一个网格,并且是您希望使用 AView 或 BView 填充的单元格之一,具体取决于用户选择。如果我只想显示 AView,我会执行以下操作:

在主视图中:

<StackPanel Name="SP_Controls" VerticalAlignment="Bottom" Grid.Row="1" Grid.Column="0">
    <ContentControl Name="ViewModelToShow" Margin="10" />
</StackPanel> 

在 MainViewModel 中:

public AViewModel ViewModelToShow{get; set;}

我现在的幼稚想法是做这样的事情:

private AViewModel _AVM;
private BViewModel _BVM;

public ... ViewModelToShow{ get; set;}

然后在代码中,例如,将视图模型设置为显示:

ViewModelToShow = _BVM; 

我唯一的问题是“...”,因为每个 ViewModel 都属于不同的类。有没有办法用泛型来做到这一点,或者我应该为我的 ViewModel 定义一个基类,然后将它们投射到其中?但如果我这样做,它们仍然会正确显示吗?谢谢。

【问题讨论】:

  • 我不确定我是否完全理解您想要做什么。您的 VM 可以从 PropertyChangedBase 甚至 Screen 继承。我在这里有一些 WPF/CM 示例:bitbucket.org/dbeattie

标签: wpf mvvm caliburn.micro


【解决方案1】:

您的视图模型应该继承自 PropertyChangedBaseScreenScreen继承自PropertyChangedBase,也实现了IScreenScreen 添加生命周期(即OnActivate 等)。

然后您可以使用您的方法,即拥有一个名为例如的公共财产。 CurrentViewModelIScreen 类型。然后,您可以在需要时将其设置为适当的视图模型。请注意,如果您希望 UI 正确更新,则此 CurrentViewModel 属性应在引用更改时在 setter 中调用 NotifyOfPropertyChange

或者,您可以将父视图模型视为两个子视图模型的导体,并使用内置的 Caliburn.Micro Conductor 类型。例如,派生自 Conductor&lt;IScreen&gt;.Collection.OneActive

然后您可以将 2 个子视图模型添加到父级的 Items 集合中,并调用 ActivateItem 方法来设置当前视图模型。然后更新您的视图的ContentControl,使其具有x:NameActiveItem

更多信息请参见here

【讨论】:

  • 感谢您的详细解答。现在我将尝试简单的方法,在我的下一个项目中,我将尝试“导体”方法。
  • 你也可以简单地使用“public object CurrentViewModel”。
【解决方案2】:

以上所有答案都是正确的。就视图位置的工作方式而言,属性类型无关紧要。只有实例的运行时类型很重要。因此,您甚至可以将属性定义为 object 类型,它仍然可以工作。只需确保您的财产发出变更通知即可。在导体的情况下,ActiveItem 会为您处理。

【讨论】:

  • 谢谢,这就是我想知道的......在阅读你的评论之前,我用基类等对其进行了测试,最后一直到 Object 并且它仍然有效。非常好。
【解决方案3】:

我通常从 ViewModelBase 类继承。它是一个包含所有属性更改的类。但是由于视图上的 DataContext 属性只是一个对象,所以类型并不重要。

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多