Хорошо, поэтому добавление предложенного кода, предоставленного E-Bat, не имело никакого эффекта, пока я не начал новый проект и не скопировал весь код дословно. Я могу только предположить, что в ViewModelLocator на http://prismlibrary.com/ должен быть какой-то фоновый код, который не обновлялся, чтобы учитывать конструктор без параметров. Надеюсь, это поможет кому-нибудь еще с той же проблемой.
Оригинальный вопрос
Я создал проект MVVM с использованием призмы. У меня есть MainWindow.xaml и 5 представлений; ButtonsView, HeaderView, ProcessInputView, ProcessLogView и ProcessSelectionView, которые я использую, каждое представление имеет связанную ViewModel.
MainWindow.xaml
Код: Выделить всё
MainWindowViewModel
Код: Выделить всё
public class MainWindowViewModel: BindableBase
{
public IEventAggregator _events;
private UserPrincipal userPrincipal;
public MainWindowViewModel(IEventAggregator events)
{
_events = events;
userPrincipal = UserPrincipal.Current;
_events.GetEvent().Subscribe(HeaderHasBeenLoaded);
}
private void HeaderHasBeenLoaded()
{
_events.GetEvent().Publish(string.Format("{0} {1}", userPrincipal.GivenName, userPrincipal.Surname));
}
}
Снимок экрана главного окна в режиме разработки
Для этого объекта не найден конструктор без параметров — это выделяет HeaderView и ButtonsView
И HeaderViewModel, и ButtonsViewModel принимают IEventAggregator в качестве параметр внутри их конструктора, в отличие от остальных моделей представления. Я предполагаю, что именно отсюда и возникают ошибки.
HeaderViewModel
Код: Выделить всё
public class HeaderViewModel: BindableBase
{
private string userName;
private string runTime;
public string UserName
{
get { return userName; }
set { SetProperty(ref userName, value); }
}
public string RunTime
{
get { return runTime; }
set { SetProperty(ref runTime, value); }
}
public HeaderViewModel(IEventAggregator events)
{
events.GetEvent().Subscribe(RunTimeUpdated);
events.GetEvent().Subscribe(UserNameUpdated);
events.GetEvent().Publish();
}
private void RunTimeUpdated(string newRunTime)
{
RunTime = newRunTime;
}
private void UserNameUpdated(string userName)
{
UserName = userName;
}
}
< /code>
Итак, как я могу донести эту ошибку, если мне нужно подписаться на эти события, и, следовательно, нужен Ieventaggregator, передан в мои ViewModels? < /p>
Br /> мне нужно зарегистрировать это в начальной загрузке с помощью переопределения метода ConfigureContainer? Если это так, я не совсем уверен, как это сделать. < /P>
bootstrap < /p>
class Bootstraper: UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
}
Буду очень признателен за любую помощь.
РЕДАКТИРОВАТЬ
Все мои конструкторы представлений имеют только методы initalizeComponent и не принимают никаких параметров
Подробнее здесь: https://stackoverflow.com/questions/412 ... his-object