WPF DataGrid ComboBoxColumn не вставляет значение - PullRequest
1 голос
/ 25 апреля 2011

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

<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 в моей viewmodel:

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));
        }
    }

1 Ответ

0 голосов
/ 25 апреля 2011

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

Мне кажется, что при вводе нового элемента свойство 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" />
...