Caliburn.Micro如何制作导航服务?

How to make a navigation service with Caliburn.Micro?

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

但是,我想遵循SOLID principles,我认为使用 ShellViewModel 作为 Conductor 违反了单一职责原则。

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

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 :

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

我是不是漏掉了什么?

导致您出现问题的问题与您的 XAML 代码段有关:您将 Content 属性 直接绑定到 ViewModelTimeSeriesViewModel),那么您的应用程序将无法如您所愿地运行。在这种情况下,您只会看到一个字符串,它表示您绑定到 ContentControl.

的对象的类型

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

  1. Caliburn 的命名约定 即您以适当的方式命名 ContentControl,以便 Caliburn 可以自动为您创建绑定。
  2. 附加的 Caliburn 属性 称为 View.Model

这两种方法都会为您在 Conductor 的 ActiveItem 属性 中推断出的 ViewModel 检索正确的视图。

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

希望我的提示和我的快速解释能帮到你。