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
属性 直接绑定到 ViewModel(TimeSeriesViewModel
),那么您的应用程序将无法如您所愿地运行。在这种情况下,您只会看到一个字符串,它表示您绑定到 ContentControl
.
的对象的类型
为了使您的应用程序正常工作,您必须使用:
- Caliburn 的命名约定 即您以适当的方式命名
ContentControl
,以便 Caliburn 可以自动为您创建绑定。
- 附加的 Caliburn 属性 称为
View.Model
。
这两种方法都会为您在 Conductor
的 ActiveItem 属性 中推断出的 ViewModel 检索正确的视图。
第一种情况你可以使用<ContentControl x:Name="ActiveItem" />
(但你需要在ShellViewModel
class中创建相应的属性);对于第二种方法,您可以使用 <ContentControl cal:View.Model="{Binding NavigationService.ActiveItem}" /
>.
希望我的提示和我的快速解释能帮到你。
我在我的 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
属性 直接绑定到 ViewModel(TimeSeriesViewModel
),那么您的应用程序将无法如您所愿地运行。在这种情况下,您只会看到一个字符串,它表示您绑定到 ContentControl
.
为了使您的应用程序正常工作,您必须使用:
- Caliburn 的命名约定 即您以适当的方式命名
ContentControl
,以便 Caliburn 可以自动为您创建绑定。 - 附加的 Caliburn 属性 称为
View.Model
。
这两种方法都会为您在 Conductor
的 ActiveItem 属性 中推断出的 ViewModel 检索正确的视图。
第一种情况你可以使用<ContentControl x:Name="ActiveItem" />
(但你需要在ShellViewModel
class中创建相应的属性);对于第二种方法,您可以使用 <ContentControl cal:View.Model="{Binding NavigationService.ActiveItem}" /
>.
希望我的提示和我的快速解释能帮到你。