【问题标题】:How to make a navigation service with Caliburn.Micro?如何使用 Caliburn.Micro 制作导航服务?
【发布时间】:2016-05-30 09:26:28
【问题描述】:

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

但是,我想遵循SOLID principles,并且我认为使用 ShellViewModel 作为 Conductor 违反了单一职责原则。

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

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}" />

我错过了什么吗?

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    导致您出现问题的问题与您的 XAML sn-p 有关:您将 Content 属性直接绑定到您的 ViewModel (TimeSeriesViewModel),然后您的应用程序无法按您的意愿运行。在这种情况下,您只会看到一个字符串,它表示您绑定到 ContentControl 的对象的类型。

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

    1. Caliburn 的命名约定,即您以正确的方式命名您的 ContentControl,以便 Caliburn 可以自动为您创建绑定。
    2. 一个名为 View.Model 的 Caliburn 附加属性

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

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

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

    【讨论】:

    • 感谢您的帮助,我需要使用 cal:View.Model 附加属性。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2015-12-15
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多