0

我目前正在使用 MahApps Metro 学习 Catel+Orchestra。我正在使用 MetroUI 执行来自 Catel.Examples 项目的身份验证示例。我的问题是当我在 MahAppsService 中创建一个新的 MainWindow

        public FrameworkElement GetMainView()
    {
        return new MainWindow();
    }

MainWindowViewModel 的构造函数永远不会被调用

public MainWindowViewModel(UIVisualizerService uiVisualizarService, IAuthenticationProvider authenticationProvider)
    {
        _uiVisualizerService = uiVisualizarService;
        _authenticationProvider = authenticationProvider;
        RoleCollection = new ObservableCollection<string>(new[] { "Read-Only", "Administrator" });
        ShowView = new Command(OnShowViewExecute, OnShowViewCanExecute, "ShowView");
    }

我已将其缩小到构造函数的 2 个依赖项。如果我删除 UIVisualizerService 和 IAuthenticacionProvider 依赖项,则正确调用构造函数,但 ModelView 稍后需要这两个服务。

我不知道我能做些什么来让它工作。

4

2 回答 2

1

您必须在 ServiceLocator 中注册 IAuthenticationProvider:

var serviceLocator = ServiceLocator.Default;

serviceLocator.RegisterType<IAuthenticationProvider, MyAuthenticationProvider>();

请注意,Catel 中的所有服务都会自动为您注册,但您必须自己注册自己的服务(例如,通过使用ModuleInit或程序集中的其他入口点)。

于 2015-07-06T17:25:25.447 回答
0

我通过将视图模型的显式注入添加到主窗口构造函数中来解决了这个问题。

public MainWindow(MainWindowViewModel _mainwindowviewmodel):base(_mainwindowviewmodel)
 {
 InitializeComponent();
 }

向 MahAppsService 类声明 AuthenticationProvider 接口的字段。

private readonly IAuthenticationProvider _authenticationProvider;

还将 AuthenticationProvider 接口的依赖添加到构造函数中。

 public MahAppsService(ICommandManager commandManager, IMessageService messageService, IUIVisualizerService uiVisualizerService, IAuthenticationProvider authenticationProvicer)
    {
        Argument.IsNotNull(() => commandManager);
        Argument.IsNotNull(() => messageService);
        Argument.IsNotNull(() => uiVisualizerService);
        Argument.IsNotNull(() => authenticationProvicer);
        _commandManager = commandManager;
        _messageService = messageService;
        _uiVisualizerService = uiVisualizerService;
        _authenticationProvider = authenticationProvicer;
    }

最后一步是在 MahAppsService 类的 GetMainView 中创建视图模型的实例。

 public FrameworkElement GetMainView()
 {
 var mainwindowViewModel = TypeFactory.Default.CreateInstanceWithParametersAndAutoCompletion<MainWindowView‌​Model>(_uiVisualizerService, _authenticationProvider);
 return new MainWindow(mainwindowViewModel);
 }

请注意,这可能不是最好的方法,但它可以完成工作。如果有人有更好的方法,请随时分享。

于 2015-07-08T15:50:33.030 回答