我在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}" />
我错过了什么吗?
答案 0 :(得分:1)
导致您出现问题的问题与您的XAML代码段有关:您将Content
属性直接绑定到 ViewModel (TimeSeriesViewModel
),那么您的应用程序无法正常工作希望。在这种情况下,您将看到一个字符串,表示您绑定到ContentControl
的对象的类型。
为了让您的应用程序正常工作,您必须使用:
ContentControl
,因此Caliburn可以自动为您创建绑定。View.Model
的Caliburn附加财产。这两种方法都会检索您在Conductor
的ActiveItem属性中推断的ViewModel的正确视图。
在第一种情况下,您可以使用<ContentControl x:Name="ActiveItem" />
(但您需要在ShellViewModel
类中创建相应的属性);使用第二种方法,您可以使用<ContentControl cal:View.Model="{Binding NavigationService.ActiveItem}" /
&gt;。
我希望我的提示和我的快速解释可以帮助你。