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