WPF DataGrid ComboBoxColumn не вставляет значение

У меня есть таблица данных WPF со столбцом со списком и двумя столбцами с текстовым полем. В моем тестовом случае, когда экран загружен, в коллекции есть две строки, к которым привязана сетка. Если я изменю содержимое любой из ячеек, оно обновится правильно. Однако, если я добавляю новую строку в сетку, когда я обновляю значение в столбце combobox, оно не обновляется в исходной коллекции. Однако столбцы текстового поля работают правильно для вновь добавленных строк. Столбцы определены как таковые:

<DataGrid.Columns>
    <DataGridComboBoxColumn Header="Type" Width="*" SelectedValueBinding="{Binding Mode=TwoWay, Path=Type.Id}"
       ItemsSource="{Binding Source={StaticResource PhoneTypeList}, Path=PhoneTypes}"
       SelectedValuePath="Id" DisplayMemberPath="Type" />
    <DataGridTextColumn Binding="{Binding NotifyOnTargetUpdated=True, Path=Number, Mode=TwoWay, ValidatesOnExceptions=False}" Header="Number" Width="*"/>
    <DataGridTextColumn Binding="{Binding NotifyOnSourceUpdated=True, Path=Extension, ValidatesOnExceptions=False}" Header="Extension" Width="*"/>
</DataGrid.Columns>

Вот свойство PhoneNumbers в моей модели просмотра:

public ObservableCollection<PhoneNumber> PhoneNumbers
        {
            get
            {
                return _phoneNumbers;
            }
            set
            {
                if (value != _phoneNumbers)
                {
                    _phoneNumbers = value;
                    OnPropertyChanged("PhoneNumbers");
                }
            }
        }

Обновление: вот мой класс PhoneNumber:

public class PhoneNumber : INotifyPropertyChanged
    {
        private string _number;
        private string _extension;
        private PhoneType _type;

        public PhoneType Type { get { return _type; }
            set { _type = value; OnPropertyChanged("Type"); } }
        public string Number
        {
            set
            {
                _number = value;
                OnPropertyChanged("Number");
            }
            get { return _number; }
        }

        public string Extension
        {
            set
            {
                _extension = value;
                OnPropertyChanged("Extension");
            }
            get { return _extension; }
        }

        public override string ToString()
        {
            return Number + (!string.IsNullOrEmpty(Extension) ? " x " + Extension : "");
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this,
                    new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }

person drowned    schedule 25.04.2011    source источник
comment
Как выглядит ваш PhoneNumberType?   -  person bendewey    schedule 25.04.2011
comment
Обновлено, чтобы показать класс номера телефона   -  person drowned    schedule 25.04.2011


Ответы (1)


Сначала проверьте окно вывода на наличие сообщений об ошибках привязки.

Мне кажется, что ваше свойство Type может иметь значение null, когда вы добавляете новый элемент. По сути, это делает свойство Id типа недоступным.

Попробуйте создать экземпляр нового объекта Type по умолчанию в конструкторе PhoneNumber.

PhoneNumber() 
{
    _type = new PhoneType();
}

Или еще лучше, привяжите поле со списком непосредственно к типу, а не к вложенному Type.Id (измените привязку SelectedValue и удалите SelectedValuePath.

<DataGridComboBoxColumn Header="Type" Width="*" SelectedValueBinding="{Binding Mode=TwoWay, Path=Type}"
   ItemsSource="{Binding Source={StaticResource PhoneTypeList}, Path=PhoneTypes}"
   DisplayMemberPath="Type" />
person bendewey    schedule 25.04.2011
comment
Мне не удалось заставить эти модификации привязки работать, но добавление объекта Type по умолчанию, похоже, устранило проблему. Большое спасибо. - person drowned; 25.04.2011
comment
Нет BindingExceptions в окне вывода - person bendewey; 25.04.2011