mmiklauz Ответов: 2

С ViewModel конструктор с parameatrs ошибки значение DataContext


Привет,
У меня есть этот код в моем файле. xaml:

<Window.DataContext>
       <viewModels:ViewModel></viewModels:ViewModel>
   </Window.DataContext>


Он отлично работает, когда ViewModel имеет конструктор без параметров, но когда я устанавливаю конструктор ViewModel с параметрами, он не будет работать.

Это бросает мне ошибку:

{"'No matching constructor found on type 'ViewModels.ViewModel'. You can use the Arguments or FactoryMethod directives to construct this type.' Line number '15' and line position '10'."}


Что я уже пробовал:

Он работает только тогда, когда конструктор ViewModel не имеет параметров, но я использую dependency injecton в своем ViewModel, поэтому не вижу здесь решения.

Как я могу решить эту проблему, но все еще иметь конструктор ViewModel с параметрами?

Заранее спасибо,

2 Ответов

Рейтинг:
0

njammy

Попробуйте ответить на этот вопрос в этом посте:

c# - WPF и Unity - нет совпадающего конструктора, найденного в type-Stack Overflow[^]


Рейтинг:
0

PureNsanity

Чтобы контейнер мог вводить параметры конструктора, инициализируемый объект должен быть инициализирован из контейнера.

// Not from container, will not cause any elements to use container
var myWindow = new MyWindow();

// From container, will allow elements to be injected
var myWindow = ServiceLocator.Current.GetInstance<mywindow>();
</mywindow>


Теперь ключевое слово в последнем примере-позволяет вводить элементы... Потому что то, как вы на самом деле это изложили, не является рекомендуемой практикой. Вы хотите, чтобы конструктор окна фактически ввел модель представления так, чтобы последний пример, который я привел (или любое другое решение), создал модель представления.

Вместо этого используйте что-то вроде этого:

[ImportingConstructor]
public ReleaseManagementView(ReleaseManagementViewModel releaseManager)
{
    InitializeComponent();

    DataContext = releaseManager;
}


Этот пример требует, чтобы ReleaseManagementViewModel будьте также зарегистрированы в контейнере. Если параметры конструктора не могут быть найдены в контейнере и не переопределены, разрешение на ReleaseManagementView потерпеть неудачу. Если я попытаюсь поместить это в XAML, как у вас, даже если все будет зарегистрировано соответствующим образом, это все равно не удастся, потому что ничто не направляет контейнер для разрешения этого элемента.

Вот почему вы получаете свою ошибку... Он не пытается разрешить эту модель представления через контейнер, поэтому нет доступного конструктора, пытающегося сделать простой new().