2016-05-30 60 views
2

我在我的MVVM WPF应用程序中使用Caliburn.Micro 3。通过遵循documentation和提供的示例,我成功地实现了在我的应用中导航。如何使用Caliburn.Micro制作导航服务?

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

为了解决这个问题,我创建了一个控制我的导航的“服务”,但是我无法设置显示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>(); 

} 

的ContentControl中从我ShellView:

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

我缺少的东西?

回答

1

这会导致你的问题的问题关于你的XAML代码片段:你是直接绑定Content属性为您视图模型TimeSeriesViewModel),那么,你希望你的应用程序无法正常工作。在这种情况下,您只会看到一个字符串,表示您绑定到ContentControl的对象的类型。

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

  1. 卡利的命名约定即你的名字你ContentControl以适当的方式,所以卡利可以自动创建为您具有约束力。
  2. a caliburn附属财产调用View.Model

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

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

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

+0

感谢您的帮助,我需要使用cal:View.Model附加属性。 – Romain