Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
На самом деле очень легко сделать. У нас есть примеры этого в Призме как jedidja упомянутый. Вы можете или сделать, чтобы ViewModel был введен с Представлением или Представлением, введены с ViewModel. В Призме StockTraderRI Вы будете видеть, что мы вводим Представление в ViewModel. По существу то, что происходит, - то, что Представление (и интерфейс View) имеет свойство Model. То свойство реализовано в codebehind для установки DataContext на значение, например: this.DataContext = value;
. В конструкторе ViewModel введено Представление. Это тогда устанавливает View.Model = this;
, который передаст себя как DataContext.
можно также легко сделать реверс и вводить ViewModel в Представление. Я на самом деле предпочитаю это, потому что это означает, что ViewModel больше не имеет обратной ссылки на представление вообще. Это означает, когда поблочное тестирование ViewModel у Вас нет представления для ровной Насмешки. Дополнительно это делает инструмент для очистки кода в этом в конструкторе Представления, это просто устанавливает DataContext на ViewModel, который был введен.
я говорю немного больше об этом в видеозаписи Разделенного разговора о Шаблонах Представления, что Jeremy Miller и я дали в Kaizenconf. Первая часть которого может быть найдена здесь http://www.vimeo.com/2189854 .
Hope это помогает, Glenn
Я думаю, что Вы совершили нападки по проблеме. Средства управления должны быть введены в их родителя, а не созданы декларативно через XAML.
Для DI для работы контейнер DI должен создать класс, который принимает зависимости. Это означает, что родитель не будет иметь никаких экземпляров дочерних элементов управления во время проектирования и посмотрит что-то как оболочка в разработчике. Это , вероятно рекомендуемый подход.
другая "альтернатива" должна иметь глобальный статический контейнер, названный от конструктора управления или чего-то подобного. Существует общий шаблон, в котором два конструктора объявляются, один со списком параметров для инжекции конструктора и другого без параметров, который делегирует:
// For WPF public Foo() : this(Global.Container.Resolve<IBar>()) {} // For the rest of the world public Foo(IBar bar) { .. }
я почти назвал бы это антишаблоном, но для того, что некоторые платформы не оставляют никакой другой выбор.
я даже не половина эксперта в WPF, таким образом, я ожидаю здоровое обслуживание downmod здесь:), но надежда это помогает. Группа Autofac (связанный от домашней страницы) могла бы быть другим местом для задавания этого вопроса. Призма или демонстрационные приложения MEF (которые включают некоторые примеры WPF) должны дать Вам общее представление о том, что возможно.
Необходимо смотреть на Призму от p& p команда. Вот сайт на Codeplex
Необходимо смотреть на Меч - это - простая платформа WPF/Silverlight MVC с поддержкой полного DI. Это выглядит действительно прохладным, и это позволяет Вам использовать любой контейнер МОК, который Вы хотите. Существует несколько примеров на документация wiki
Humm, Мы испытываем подобную проблему, мы ожидаем к решению, которое обеспечит Поддержку режима разработки под Смешением Выражения 2.0 (Сильный Тип). Плюс мы ожидаем к решению иметь некоторых Mock+Auto-Generated образец данных, доступный под Смешением Выражения.
, Конечно, мы смотрим также для имения весь тех вещь работа с помощью шаблона МОК.
Paul Stovell как интересная статья для запуска с: http://www.paulstovell.com/blog/wpf-dependency-injection-in-xaml
, Таким образом, я пробую пару вещи добавить более ценную поддержку режима разработки Привязки и насмешки объекта во Время проектирования, прямо сейчас I’m, имеющий большую часть моей проблемы, связанной для получения сильной введенной связи, установленной между Представлением (код) к ModelView (Xaml), я попробовал пару сценария:
1.) Решение 1: Используя Универсальный для создания Представления
public class MyDotNetcomponent<T> : SomeDotNetcomponent
{
// Inversion of Control Loader…
// Next step add the Inversion of control manager plus
// some MockObject feature to work under design time
public T View {Get;}
}
не работает Это решение, так как Смешение не поддерживает Универсальный, внутри поверхность для дизайна, но Xaml действительно имеют некоторых, хорошо работают во времени выполнения, но не при дизайне;
2.) Решение 2: ObjectDataProvider
<ObjectDataProvider ObjectType="{x:Type CP:IFooView}" />
<!-- Work in Blend -->
<!—- IOC Issue: we need to use a concrete type and/or static Method there no way to achive a load on demande feature in a easy way -->
3.) Решение 3: Наследуйте ObjectDataProvider
<CWD:ServiceObjectDataProvider ObjectType="{x:Type CP:IFooView}" />
<!-- Cannot inherit from ObjectDataProvider to achive the right behavior everything is private-->
4.) Решение 4: Создайте ложный ObjectDataProvider с нуля к заданию
<CWD:ServiceObjectDataProvider ObjectType="{x:Type CP:IFooView }" />
<!-- Not working in Blend, quite obvious-->
5.) Решение 5: Создайте Расширение Разметки (Paul Stovell)
<CWM:ServiceMarkup MetaView="{x:Type CP:IFooView}"/>
<!-- Not working in Blend -->
Только для очистки одной точки, когда я сказал “not, работающий в blend”, я подразумеваю, что Обязательное диалоговое окно не применимо, и разработчик должен написать от руки XAML отдельно.
Наш следующий шаг должен будет, вероятно, занять время для оценки способности создать плагин для Смешения Выражения.
Да, мы делаем все это время. Можно "ввести" ViewModel в DataContext управления.
я на самом деле нахожу WPF быть еще легче использовать с DI. Даже объекты зависимости и свойства работают с ним беспрепятственно.