Объявление ViewModel с использованием конструктора Injection в XAML - PullRequest
1 голос
/ 14 марта 2012

Я пробую 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 и каковы большие различия между ними?

Спасибо, Raphi

1 Ответ

1 голос
/ 14 марта 2012

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; }
}
...