目前,我正在使用Catel+Orchestra地铁学习MahApps。我正在使用Catel.Examples项目使用MetroUI执行身份验证示例。我的问题是当我在MahAppsService中创建一个新的MahAppsService时
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稍后需要这两个服务。
我不知道该怎么做才能做到这一点。
发布于 2015-07-08 15:50:33
我通过将视图模型显式注入到mainwindow构造函数中解决了这个问题。
public MainWindow(MainWindowViewModel _mainwindowviewmodel):base(_mainwindowviewmodel)
{
InitializeComponent();
}
向AuthenticationProvider类声明MahAppsService接口的字段。
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;
}
最后一步是在GetMainView中的MahAppsService类中创建视图模型的一个实例。
public FrameworkElement GetMainView()
{
var mainwindowViewModel = TypeFactory.Default.CreateInstanceWithParametersAndAutoCompletion<MainWindowViewModel>(_uiVisualizerService, _authenticationProvider);
return new MainWindow(mainwindowViewModel);
}
请注意,这可能不是最好的方法,但它可以完成工作。如果有人有更好的方法,可以自由地分享。
发布于 2015-07-06 17:25:25
您必须在IAuthenticationProvider中注册ServiceLocator:
var serviceLocator = ServiceLocator.Default;
serviceLocator.RegisterType<IAuthenticationProvider, MyAuthenticationProvider>();
注意,Catel中的所有服务都会自动为您注册,但是您必须自己注册自己的服务(例如,使用ModuleInit或程序集中的其他入口点)。
https://stackoverflow.com/questions/31251416
复制相似问题