2011-04-25 1 views
1

콤보 상자 열과 두 개의 텍스트 상자 열이있는 WPF DataGrid가 있습니다. 내 테스트의 경우 화면이로드 될 때 그리드가 바인딩되는 컬렉션의 행이 두 개 있습니다. 셀의 내용을 변경하면 제대로 업데이트됩니다. 그러나 새 행을 표에 추가하면 콤보 상자 열의 값을 업데이트 할 때 원본 컬렉션에서 업데이트되지 않습니다. 텍스트 상자 열은 새로 추가 된 행에 대해 제대로 작동합니다. 열은 같은 정의됩니다WPF DataGrid ComboBoxColumn 값을 삽입하지 않음

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

업데이트 :

여기
<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 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)); 
     } 
    } 
+0

당신이 좋아? 나는이 바인딩 수정 작업을 얻을 수있는 전화 번호 클래스 – bendewey

+0

보이지만, 기본 유형의 객체를 추가하는 문제를 해결 한 것으로 보인다 PhoneNumberType 무엇. 고마워. – drowned

답변

0

, 당신의 출력을 먼저 확인 : 여기 내 PHONENUMBER 클래스입니다 모든 바인딩 오류 메시지의 창.

새 항목을 추가 할 때 Type 속성이 null 일 수 있습니다. 기본적으로 Type의 Id 속성에 액세스 할 수 없게 만듭니다.

, 더 나은 아직 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" /> 
+0

을 표시하도록 업데이트 – drowned

+0

출력 창에 BindingExceptions이 없음 – bendewey

+0

아니요, 바인딩 예외가 없습니다. – drowned