gpt4 book ai didi

c# - 如何使用 Caliburn.Micro 制作导航服务?

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:19 25 4
gpt4 key购买 nike

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

但是,我想关注 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}" />

我错过了什么吗?

最佳答案

导致您出现问题的问题与您的 XAML 片段有关:您正在绑定(bind) Content属性直接添加到您的 ViewModel ( TimeSeriesViewModel ),那么您的应用程序将无法按您的意愿工作。在这种情况下,您只会看到一个字符串,它代表您绑定(bind)到 ContentControl 的对象的类型。 .

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

  1. Caliburn 的命名约定,即您将 ContentControl 命名为以适当的方式,以便 Caliburn 可以自动为您创建绑定(bind)。
  2. Caliburn 附属属性(property) 名为 View.Model .

这两种方法都为您在 Conductor 的 ActiveItem 属性中推断出的 ViewModel 检索正确的 View .

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

希望我的提示和我的快速解释能对您有所帮助。

关于c# - 如何使用 Caliburn.Micro 制作导航服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37522136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com