Новое значение WPF MVVM Editable Combobox равно null

111
10

Пробовал все решения по подобным вопросам здесь, по-прежнему нет. У меня есть 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");
}
}

спросил(а) 2021-01-12T21:29:28+03:00 1 неделя, 3 дня назад
1
Решение
60

Ваше 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, а не к суб-свойству этого.

ответил(а) 2021-01-12T21:29:28+03:00 1 неделя, 3 дня назад
43

Создайте новую переменную, чтобы сохранить текст 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; });
}
}

ответил(а) 2021-01-12T21:29:28+03:00 1 неделя, 3 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема