Внедрение зависимости модели представления с помощью конструктора не по умолчанию
В приложении Windows Phone у меня есть пользовательский элемент управления, который привязан к экземпляру BookProgressInfo
учебный класс.
<deusControls:BookProgressBar BookProgressValue="{Binding BookProgressInfo}" Width="430" />
Всякий раз, когда BookProgressInfo
изменения, а
static void BookProgressValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var bookProgressBar = (BookProgressBar)sender;
var progressInfo = (BookProgressInfo) e.NewValue;
if(progressInfo != null && progressInfo.Id != 0)
bookProgressBar.ProgressBarListBox.DataContext = new BookProgressBarViewModel(progressInfo, bookProgressBar.Width);
}
вызывается. Я устанавливаю новый DataContext на bookProgressBar.ProgressBarListBox
каждый раз, когда изменяется связанное свойство для всего элемента управления.
Раньше у меня был только один BookProgressBarViewModel, поэтому все работало нормально, как реализовано в приведенном выше фрагменте.
Теперь я хочу поддержать разные BookProgressBarViewModel
с, поэтому я ввел интерфейс - IBookProgressBarViewModel.
Как видите, конструктор для BookProgressBarViewModel
имеет параметры.
Я использую ядро Ninject в качестве контейнера IoC, и оно запускается в App.xaml.
Как я могу создать экземпляр соответствующего IBookProgressBarViewModel
определяется в контейнере IoC в пределах BookProgressValueChanged
?
ОБНОВЛЕНИЕ: Я изменил архитектуру, так что мне не нужно вызывать конструктор модели параметризованного представления из обработчика событий изменения свойства зависимости. Тем не менее, я хотел бы услышать ваши предложения по этому вопросу.
1 ответ
Почему бы все еще не использовать контейнер IoC, а затем сделать ваши значения Lazy Loaded? Затем ваш IoC может внедрить ваши зависимости и создать эти экземпляры, и пока вы не узнаете его значения, вы просто обновите его свойство при необходимости.