Prism:Register View With Region 找不到 public 构造函数
Prism: RegisterViewWithRegion does not find public contructor
我在使用 regionManager.RegisterViewWithRegion
方法时遇到了一些问题。
我使用 Prism.Unity 和 Prism.Wpf(均为 v7.2.0.1367)
当我想在 UIModule.cs
中注册视图 ShowStringView
(我创建这个视图只是为了开始使用 prism...)时,我总是在 Set property 'Prism.Mvvm.ViewModelLocator.AutoWireViewModel' threw an exception.' Line number '7' and line position '14'.
ShowStringView.xaml
.
当我交换 ShowStringViewModel.cs
中的构造函数时,它以 IDBInteraction 作为参数,使用不带参数的构造函数。 (见下文)
我确定有些东西我没有想到或者我使用错误的方式...
如果有人能帮助我,那就太好了。
提前致谢!
更新 1
DBInteraction.cs 有一些问题(参见 )
我的代码
DBInteraction.cs(更新 1)
public class DBInteraction : IDBInteraction
{
LinqToTaskPlanSqlDataContext dataContext;
public DBInteraction()
{
string connectionString = ConfigurationManager.ConnectionStrings["TaskPlanConnectionString"].ConnectionString;
dataContext = new LinqToTaskPlanSqlDataContext(connectionString);
}
}
Shell.xaml
<Window x:Class="TP.Client.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TP.Client"
xmlns:prism="http://prismlibrary.com/"
xmlns:region="clr-namespace:TP.Common;assembly=TP.Common"
mc:Ignorable="d"
Title="Shell" Height="450" Width="800">
<Grid>
<ContentControl prism:RegionManager.RegionName="{x:Static region:RegionNames.ShowStringRegion}" />
</Grid>
</Window>
App.xaml.cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<DataServiceModule>();
moduleCatalog.AddModule<UIModule>();
}
}
DataServiceModule.cs
public class DataServiceModule : IModule
{
public DataServiceModule()
{
}
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>(typeof(DBInteraction).FullName);
}
}
UIModule.cs
public class UIModule : IModule
{
IRegionManager _regionManager;
public UIModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ShowStringRegion, typeof(ShowStringView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
ViewModelLocationProvider.Register<ShowStringView, ShowStringViewModel>();
}
}
ShowStringView.xaml
<UserControl x:Class="TP.UI.View.ShowStringView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TP.UI.View"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
<Grid>
<TextBox Text="{Binding Content}" Height="20" Width="150" BorderBrush="Black"/>
</Grid>
ShowStringViewModel
public class ShowStringViewModel : BindableBase
{
IDBInteraction _dBInteraction;
public ShowStringViewModel()
{
Content = "Hallo";
}
// It works when this ctor is comment-out
public ShowStringViewModel(IDBInteraction dBInteraction)
{
_dBInteraction = dBInteraction;
Content = "Hallo";
}
private string _content;
public string Content
{
get => _content;
set => SetProperty(ref _content, value);
}
}
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>(typeof(DBInteraction).FullName);
这是你的问题。您进行命名注册,不符合默认注册的条件(视图模型定位器正在寻找的内容)。
将 DBInteraction
注册为默认值,您应该没问题:
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>();
查看更新 1
在 DBInteraction 构造函数内部,我确实从 app.config
文件中读取了 connectionString。
问题是这个文件不在我的启动项目中,它在一个类库项目中。
我刚刚将 app.config
文件从 ClassLibrary 移动到 Startup(在 MSVS 解决方案资源管理器中拖放)并且一切正常。
这就是无法创建 DBInteraction 的原因 -> 构造函数中始终存在异常。
app.config file in wrong place
我在使用 regionManager.RegisterViewWithRegion
方法时遇到了一些问题。
我使用 Prism.Unity 和 Prism.Wpf(均为 v7.2.0.1367)
当我想在 UIModule.cs
中注册视图 ShowStringView
(我创建这个视图只是为了开始使用 prism...)时,我总是在 Set property 'Prism.Mvvm.ViewModelLocator.AutoWireViewModel' threw an exception.' Line number '7' and line position '14'.
ShowStringView.xaml
.
当我交换 ShowStringViewModel.cs
中的构造函数时,它以 IDBInteraction 作为参数,使用不带参数的构造函数。 (见下文)
我确定有些东西我没有想到或者我使用错误的方式...
如果有人能帮助我,那就太好了。
提前致谢!
更新 1
DBInteraction.cs 有一些问题(参见
我的代码
DBInteraction.cs(更新 1)
public class DBInteraction : IDBInteraction
{
LinqToTaskPlanSqlDataContext dataContext;
public DBInteraction()
{
string connectionString = ConfigurationManager.ConnectionStrings["TaskPlanConnectionString"].ConnectionString;
dataContext = new LinqToTaskPlanSqlDataContext(connectionString);
}
}
Shell.xaml
<Window x:Class="TP.Client.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TP.Client"
xmlns:prism="http://prismlibrary.com/"
xmlns:region="clr-namespace:TP.Common;assembly=TP.Common"
mc:Ignorable="d"
Title="Shell" Height="450" Width="800">
<Grid>
<ContentControl prism:RegionManager.RegionName="{x:Static region:RegionNames.ShowStringRegion}" />
</Grid>
</Window>
App.xaml.cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<DataServiceModule>();
moduleCatalog.AddModule<UIModule>();
}
}
DataServiceModule.cs
public class DataServiceModule : IModule
{
public DataServiceModule()
{
}
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>(typeof(DBInteraction).FullName);
}
}
UIModule.cs
public class UIModule : IModule
{
IRegionManager _regionManager;
public UIModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RegisterViewWithRegion(RegionNames.ShowStringRegion, typeof(ShowStringView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
ViewModelLocationProvider.Register<ShowStringView, ShowStringViewModel>();
}
}
ShowStringView.xaml
<UserControl x:Class="TP.UI.View.ShowStringView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TP.UI.View"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
<Grid>
<TextBox Text="{Binding Content}" Height="20" Width="150" BorderBrush="Black"/>
</Grid>
ShowStringViewModel
public class ShowStringViewModel : BindableBase
{
IDBInteraction _dBInteraction;
public ShowStringViewModel()
{
Content = "Hallo";
}
// It works when this ctor is comment-out
public ShowStringViewModel(IDBInteraction dBInteraction)
{
_dBInteraction = dBInteraction;
Content = "Hallo";
}
private string _content;
public string Content
{
get => _content;
set => SetProperty(ref _content, value);
}
}
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>(typeof(DBInteraction).FullName);
这是你的问题。您进行命名注册,不符合默认注册的条件(视图模型定位器正在寻找的内容)。
将 DBInteraction
注册为默认值,您应该没问题:
containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>();
查看更新 1
在 DBInteraction 构造函数内部,我确实从 app.config
文件中读取了 connectionString。
问题是这个文件不在我的启动项目中,它在一个类库项目中。
我刚刚将 app.config
文件从 ClassLibrary 移动到 Startup(在 MSVS 解决方案资源管理器中拖放)并且一切正常。
这就是无法创建 DBInteraction 的原因 -> 构造函数中始终存在异常。
app.config file in wrong place