1

コンボボックス列と 2 つのテキストボックス列を持つ WPF データグリッドがあります。私のテスト ケースでは、画面が読み込まれると、グリッドがバインドされているコレクションに 2 つの行があります。いずれかのセルの内容を変更すると、正しく更新されます。ただし、グリッドに新しい行を追加すると、コンボボックス列の値を更新しても、ソース コレクションでは更新されません。ただし、テキストボックスの列は、新しく追加された行に対して適切に機能します。列は次のように定義されます。

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

1 に答える 1

0

まず、バインディング エラー メッセージがないか出力ウィンドウを確認します。

新しいアイテムを追加すると、 Type プロパティが null になる可能性があるように見えます。これにより、基本的に Type の Id プロパティにアクセスできなくなります。

PhoneNumber コンストラクターで新しいデフォルトの Type オブジェクトをインスタンス化してみてください

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" />
于 2011-04-25T16:06:48.327 に答える