Новое значение WPF MVVM Editable Combobox равно null
Пробовал все решения по подобным вопросам здесь, по-прежнему нет. У меня есть ComboBox
который должен работать для выбора существующих элементов и/или для добавления новых. Работает только выбранная часть. Категория - это просто объект с Name
и Id
.
Заранее спасибо!
XAML
<ComboBox Name="CbCategory" ItemsSource="{Binding Categories}"
SelectedItem="{Binding SelectedCategory.Name, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding NewCategory.Name}" DisplayMemberPath="Name"
IsEditable="True"/>
Code behind
private Category _selectedCategory;
public Category SelectedCategory
{
get { return _selectedCategory; }
set
{
if (Equals(_selectedCategory, value)) return;
_selectedCategory = value;
SendPropertyChanged("SelectedCategory");
}
}
private Category _newCategory;
public Category NewCategory
{
get { return _newCategory; }
set
{
if (Equals(_newCategory, value)) return;
_newCategory = value;
SendPropertyChanged("NewCategory");
}
}
Ваше Text
связывание не работает, потому что вы привязываетесь к свойству null
Category
. Создайте его вместо этого.
public Category NewCategory
{
get { return _newCategory ?? (_newCategory = new Category()); }
set
{
if (Equals(_newCategory, value)) return;
_newCategory = value;
SendPropertyChanged("NewCategory");
}
}
Изменить: Разработка в соответствии с вашим комментарием:
Ваша привязка к ComboBox.Text
установлена на "{Binding NewCategory.Name}"
, поэтому независимо от значения SelectedCategory
свойство Text
всегда будет отображать имя NewCategory
.
Когда NewCategory
имеет значение NULL, свойство Text
не имеет никакого отношения к привязке, и поэтому двухсторонняя привязка не может быть выполнена (то есть значение свойства Text
не может быть возвращено в NewCategory.Name
, поскольку это вызовет NullReferenceException
( потому что NewCategory
имеет значение null).
Это не влияет на случай SelectedItem
, потому что это привязка непосредственно к свойству SelectedCategory
, а не к суб-свойству этого.
Создайте новую переменную, чтобы сохранить текст combobox. Если выбранный элемент с нулевым значением получает текст combobox в качестве нового элемента,
Код:
<ComboBox Name="CbCategory" ItemsSource="{Binding Categories}"
SelectedItem="{Binding SelectedCategory.Name, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding Name}" DisplayMemberPath="Name"
IsEditable="True"/>
private String _name;
public Category Name
{
get { return _name; }
set
{
_name = value
SendPropertyChanged("Name");
}
}
public ICommand ItemChange
{
get
{
'return new RelayCommand(() =>'{
try{string item = this.SelectedCategory.Code;}
catch(Exception ex){string item = this.Name;}
}, () => { return true; });
}
}