Объявление 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; }
}
Другие вопросы по тегам