Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用Prism.Mvvm.ViewModelLocationProvider手动将视图注册到ViewModel_C#_Wpf_.net Core_Prism - Fatal编程技术网

C# 无法使用Prism.Mvvm.ViewModelLocationProvider手动将视图注册到ViewModel

C# 无法使用Prism.Mvvm.ViewModelLocationProvider手动将视图注册到ViewModel,c#,wpf,.net-core,prism,C#,Wpf,.net Core,Prism,文件夹结构- Project Named 'Home' |> Views > HomeView.xaml |> ViewModels > HomeViewModel.cs |> HomeModule.cs (an IModule class) HomeView.XAML(注意:AutoWireViewModel设置为FALSE) HomeModule.cs public class HomeViewModel : BindableBase { privat

文件夹结构-

Project Named 'Home'
|> Views > HomeView.xaml
|> ViewModels > HomeViewModel.cs
|> HomeModule.cs (an IModule class)
HomeView.XAML(注意:AutoWireViewModel设置为FALSE)

HomeModule.cs

public class HomeViewModel : BindableBase
{
    private string _message = "Hi There!";
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }

    public HomeViewModel()
    {

    }
}
public class HomeModule : IModule
{
    private readonly IRegionManager _regionManager;

    public HomeModule(IRegionManager regionManager)
    {
        _regionManager = regionManager;
    }

    public void OnInitialized(IContainerProvider containerProvider)
    {
        _regionManager.RegisterViewWithRegion("ContentRegion", typeof(HomeView));
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        ViewModelLocationProvider.Register<HomeView, HomeViewModel>();
    }
}
公共类HomeModule:IModule
{
私有只读IRegionManager _regionManager;
公共家庭模块(IRegionManager regionManager)
{
_regionManager=regionManager;
}
初始公共无效(IContainerProvider-containerProvider)
{
_regionManager.RegisterViewWithRegion(“ContentRegion”,typeof(HomeView));
}
公共无效注册表类型(IContainerRegistry containerRegistry)
{
ViewModelLocationProvider.Register();
}
}
如您所见,我正在向
ViewModelLocationProvider
注册HomeView&HomeViewModel。但这不起作用。当
AutoWireViewModel
设置为
True


我做错了什么?我知道我可以自动布线,但我正在尝试学习Prism,Brian Lagunas的一个视频提到手动布线更快,因为不需要反射。

当您将视图和视图模型手动注册到视图模型定位器时,您仍然必须在视图模型中启用自动布线,它将改变视图模型定位器解析视图及其视图模型的方式。设置
False
将禁用它,因此它不会解决任何问题

prism:ViewModelLocator.AutoWireViewModel="True"
正如您从《ViewModelLocationProvider参考》中所看到的,在解析视图模型时,将首先检查已注册的视图。如果没有注册,将使用通过反射使用命名约定进行解析的回退

public static void AutoWireViewModelChanged(object view, Action<object, object> setDataContextCallback)
{
   object viewModel = GetViewModelForView(view);

   if (viewModel == null)
   {
      // Try to resolve the view model via regsitrations
      var viewModelType = GetViewModelTypeForView(view.GetType());

      // If views and view models are not registerd, fallback to reflection
      if (viewModelType == null)
         viewModelType = _defaultViewTypeToViewModelTypeResolver(view.GetType());

      //...
   }

   // ...
}
public static void AutoWireViewModelChanged(对象视图,操作setDataContextCallback)
{
对象视图模型=GetViewModelForView(视图);
if(viewModel==null)
{
//尝试通过正则表达式解析视图模型
var viewModelType=GetViewModelTypeForView(view.GetType());
//如果未注册视图和视图模型,请回退到反射
如果(viewModelType==null)
viewModelType=_defaultViewTypeToViewModelTypeResolver(view.GetType());
//...
}
// ...
}
由于
ViewModelLocator
将通过注册或命名约定回退来解析视图,因此您没有注意到差异。如果将
HomeViewModel
重命名为
HomeFooBar
或任何其他不符合命名约定的内容,则回退将失败,您将看到它的工作方式如上所述

[…]手动布线速度更快,因为不需要反射


我认为关于反思有很多误解。在这种情况下,使用一些视图,您甚至不会注意到任何差异,这会更加方便。不要过早优化。

谢谢!一旦你看了源代码,这就很有意义了。同时也非常感谢让我意识到我需要参考源代码-我只是依靠文档,将其设置为false对于手动布线来说似乎很直观。
public static void AutoWireViewModelChanged(object view, Action<object, object> setDataContextCallback)
{
   object viewModel = GetViewModelForView(view);

   if (viewModel == null)
   {
      // Try to resolve the view model via regsitrations
      var viewModelType = GetViewModelTypeForView(view.GetType());

      // If views and view models are not registerd, fallback to reflection
      if (viewModelType == null)
         viewModelType = _defaultViewTypeToViewModelTypeResolver(view.GetType());

      //...
   }

   // ...
}