Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
У нас была подобная проблема на прошлой неделе. Это имеет отношение как SelectedValue
обновления его внутренности. То, что мы нашли, было то, если бы Вы устанавливаете SelectedValue
, это не видело бы изменения, которое мы должны были вместо этого установить SelectedItem
, который правильно обновил бы каждую вещь. Мое заключение состоит в том, что SelectedValue
разработаны для, добираются , операции и не устанавливают . Но это может просто быть ошибкой в текущей версии 3.5sp1 .net
Пробежался к чему-то подобному, наконец, я просто подписался на событие SelectionChanged для раскрывающегося списка и установил с ним свойство данных. Глупо и желать этого было не нужно, но это сработало.
Разумно ли установить SelectedValuePath = "Content" в xaml выпадающего списка, а затем использовать SelectedValue в качестве привязки?
Похоже, что у вас есть список строк, и вы хотите, чтобы привязка просто сопоставляла строки с фактическим содержимым элемента в поле со списком, поэтому, если вы сообщите ему, какое свойство использовать для SelectedValue, оно должно работать; по крайней мере, у меня это сработало, когда я столкнулся с этой проблемой.
Похоже, Content было бы разумным значением по умолчанию для SelectedValue, но, возможно, это не так?
Режим привязки должен быть OneWayToSource или TwoWay, поскольку источник - это то, что вы хотите обновить. Mode OneWay - это Source to Target и, следовательно, делает Source ReadOnly, что приводит к тому, что источник никогда не обновляется.
Вы знаете ... Я сегодня много часов борюсь с этой проблемой, и знаете, что я узнал? Это была проблема с DataType! Список, который заполнял ComboBox, был Int64, и я пытался сохранить значение в поле Int32! Никаких ошибок не возникало, просто не сохранялись значения!
Чтобы разжечь разговор двухлетней давности:
Другая возможность, если вы хотите использовать строки, - это привязать их к свойству Text поля со списком.
<ComboBox Text="{Binding Test}">
<ComboBoxItem Content="A" />
<ComboBoxItem Content="B" />
<ComboBoxItem Content="C" />
</ComboBox>
Это связано с чем-то вроде:
public class TestCode
{
private string _test;
public string Test
{
get { return _test; }
set
{
_test = value;
NotifyPropertyChanged(() => Test); // NotifyPropertyChanged("Test"); if not using Caliburn
}
}
}
Приведенный выше код является двусторонним, поэтому, если вы установите Test = "B"; в коде в поле со списком будет отображаться «B», а затем, если вы выберете «A» в раскрывающемся списке, связанное свойство отразит изменение.