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

时间:2016-05-30 09:26:29

标签: c# wpf mvvm caliburn.micro

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

但是,我想关注SOLID principles ,我认为使用ShellViewModel作为指挥违反了单一责任原则。

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

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

我在我的&#34; ShellViewModel&#34;。

中使用它
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}" />

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

导致您出现问题的问题与您的XAML代码段有关:您将Content属性直接绑定到 ViewModel TimeSeriesViewModel),那么您的应用程序无法正常工作希望。在这种情况下,您将看到一个字符串,表示您绑定到ContentControl的对象的类型。

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

  1. Caliburn的命名惯例即您以正确的方式命名ContentControl,因此Caliburn可以自动为您创建绑定。
  2. 名为View.Model的Caliburn附加财产
  3. 这两种方法都会检索您在Conductor的ActiveItem属性中推断的ViewModel的正确视图。

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

    我希望我的提示和我的快速解释可以帮助你。