Объявление ViewModel с использованием конструктора Injection в XAML
Я пробую Unity, и у меня возникают проблемы с объявлением моей модели представления в XAML. Можете ли вы помочь мне? XAML:
<UserControl.DataContext>
<search:SearchBoxViewModel />
</UserControl.DataContext>
Конструктор:
[ImportingConstructor]
public SearchBoxViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
{
this.regionManager = regionManager;
this.eventAggregator = eventAggregator;
}
Когда я пытаюсь выполнить, я получаю разрешение исключения. Это работало, когда у viewmodel был пустой конструктор. Кажется, что у него есть проблемы с инжектором конструктора.
Если я загружаю модуль так:
var searchView = Container.Resolve<SearchBoxView>();
searchView.DataContext = Container.Resolve<SearchBoxViewModel>();
//RegionManager.RegisterViewWithRegion(RegionNames.SearchRegion, typeof(SearchBoxView));
RegionManager.Regions[RegionNames.SearchRegion].Add(searchView);
Оно работает.
Есть ли возможность сделать это с xaml (с лично я думаю, что лучше)?
Кстати: я создаю приложение с wpf, которое в первую очередь связывается с веб-сервисом. Что мне лучше использовать: единство или MEF и каковы большие различия между ними?
Спасибо рафи
1 ответ
http://msdn.microsoft.com/en-us/library/ms753379.aspx:
Требования к пользовательскому классу как элементу XAML
Чтобы иметь возможность создания экземпляра в качестве элемента объекта, ваш класс должен соответствовать следующим требованиям:
Ваш пользовательский класс должен быть общедоступным и поддерживать общедоступный конструктор по умолчанию (без параметров). (См. Следующий раздел для заметок, касающихся структур.)
...
Итак, если вы хотите использовать зависимости, вы должны исправить что-то вроде:
var searchView = Container.Resolve<SearchBoxView>();
public class SearchBoxView: UserControl
{
[Dependency]
public SearchBoxViewModel ViewModel
{
get { return (SearchBoxViewModel)DataContext; }
set { DataContext = value; }
}