如何使用Caliburn.Micro制作导航服务



我在我的MVVM WPF应用程序中使用Caliburn.Micro 3。我按照提供的文档和示例成功地在我的应用程序中实现了导航。

但是,我想遵循SOLID原则,我认为使用ShellViewModel作为导体违反了单一责任原则。

为了解决这个问题,我创建了一个"服务"来控制我的导航,但我无法显示ActiveItem。当我导航时,我将视图模型名称作为字符串,而不是与之关联的视图。

public class NavigationService : Conductor<IScreen>, INavigationService
{
    public void GoTo<T>() where T : IScreen
    {
        var viewModel = IoC.Get<T>();
        ActivateItem(viewModel);
    }
}

我从我的"ShellViewModel"中使用它。

public class ShellViewModel : PropertyChangedBase
{
    private readonly INavigationService _navigationService;
    public HomeViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }
    public INavigationService NavigationService => _navigationService;
    public void ShowChartPage() => _navigationService.GoTo<TimeSeriesViewModel>();
}

来自我的ShellView的内容控件:

<ContentControl Content="{Binding NavigationService.ActiveItem}" />

我错过了什么吗?

导致问题的问题与 XAML 代码段有关:将 Content 属性直接绑定到 ViewModelTimeSeriesViewModel ),则应用程序无法按预期工作。在这种情况下,您只会看到一个字符串,该字符串表示要绑定到ContentControl的对象的类型。

为了使您的应用程序正常工作,您必须使用:

  1. Caliburn的命名约定,即您以正确的方式命名ContentControl,因此Caliburn可以自动为您创建绑定。
  2. 名为 View.Model卡利本附属属性

这两种方法都检索您在Conductor的活动项属性中推断的视图模型的正确视图。

在第一种情况下,您可以使用<ContentControl x:Name="ActiveItem" />(但您需要在ShellViewModel类中创建相应的属性);对于第二种方法,您可以使用<ContentControl cal:View.Model="{Binding NavigationService.ActiveItem}" />。

我希望我的提示和我的快速解释可以对您有所帮助。

最新更新