Prism: RegisterViewWithRegion не находит конструктор publi c - PullRequest
0 голосов
/ 12 января 2020

У меня проблемы с методом regionManager.RegisterViewWithRegion. Я использую Prism.Unity и Prism.Wpf (оба v7.2.0.1367)

Когда я хочу зарегистрировать представление ShowStringView (я создал это представление только для начала работы с призмой ...) в UIModule.cs, я всегда получаю Set property 'Prism.Mvvm.ViewModelLocator.AutoWireViewModel' threw an exception.' Line number '7' and line position '14'. внутри ShowStringView.xaml.

enter image description here

Когда я обмениваю строителя на 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 12 января 2020

См. Update1

Внутри конструктора DBInteraction я читаю строку подключения из файла app.config.

Проблема заключалась в том, что этот файл отсутствовал в моем Startup-проекте, он был в ClassLibrary-Project.

Я только что переместил файл app.config из ClassLibrary в Startup (перетаскивание в MSVS Solution Explorer) и все заработало.

Вот почему DBInteraction просто не удалось создать -> всегда было исключение внутри конструктора.

файл app.config в неправильном месте

0 голосов
/ 12 января 2020

containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>(typeof(DBInteraction).FullName);

Это ваша проблема. Вы делаете именованную регистрацию, которая не квалифицируется как регистрация по умолчанию (что ищет локатор модели представления).

Регистрация DBInteraction по умолчанию, с вами должно быть все в порядке:

containerRegistry.RegisterSingleton<IDBInteraction, DBInteraction>();
...