我在我的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
属性直接绑定到 ViewModel ( TimeSeriesViewModel
),则应用程序无法按预期工作。在这种情况下,您只会看到一个字符串,该字符串表示要绑定到ContentControl
的对象的类型。
为了使您的应用程序正常工作,您必须使用:
-
Caliburn的命名约定,即您以正确的方式命名
ContentControl
,因此Caliburn可以自动为您创建绑定。 - 名为
View.Model
的卡利本附属属性。
这两种方法都检索您在Conductor
的活动项属性中推断的视图模型的正确视图。
在第一种情况下,您可以使用<ContentControl x:Name="ActiveItem" />
(但您需要在ShellViewModel
类中创建相应的属性);对于第二种方法,您可以使用<ContentControl cal:View.Model="{Binding NavigationService.ActiveItem}" /
>。
我希望我的提示和我的快速解释可以对您有所帮助。