추측컨데 Binding Path에 오타가 있는것이 아니라면, MainWindow의 생성자 내에서 DataContext를 지정한 이후로 TestDataModel.TestSummartData 또는 TestSummary.TestSets 리스트에 항목을 추가하셨거나 리스트의 특정 인덱스에 직접 할당하셨을 것 같습니다.
public MainWindow()
{
InitializeComponent();
DMinit();
DataContext = DM;
.... // 이 부분
Loaded += MainWindow_Loaded; // 혹은 이 부분
}
예상하는 코드는 업데이트 코드는 아래와 같을 것입니다.
VM.TestSummaryData.Add(new TestSummary { ... });
// 또는
VM.TestSummaryData[0] = new TestSummary { ... };
// 또는
VM.TestSummaryData[0].TestSets.Add(new TestSet { ... });
// 또는
VM.TestSummaryData[0].TestSets[0] = new TestSet { ... };
데이터 바인딩의 핵심은 Binding Path에 포함된 요소들이 변경되었다는 것을 바인딩 엔진에게 알려주는 것입니다. 이를 구현하는 장치가 크게 DependencyProperty, INotifyPropertyChanged 입니다.
위 바인딩 구문에서 Binding Path에 포함(변경 시 바인딩 타겟을 업데이트 시키는)된 요소는
(DataContext): 상위 Loginal Tree로부터 내려온 DataContext 인스턴스
TestSummaryData: DataContext의 TestSummaryData 속성
TestSummaryData[0]: 2번 리스트내 0번째 요소
TestSets: 3번 인스턴스의 TestSets 속성
TestSets[0]: 4번 리스트 내 0번째 요소
TestName: 5번 인스턴스의 TestName 속성
올려주신 그림에서 PropertyChanged 이벤트를 발생시키도록 작성하신 속성은 TestSummary 클래스의 TestCode 속성, TestSet 클래스의 TestName, Duration, UpperLimit 속성들 이렇게 네 부분으로 추측됩니다. 따라서 위 코드에서 지정하신 Binding Path내에 포함된 TestName이 변경될 경우 바인딩 업데이트가 발생할 것입니다.
그런데 2번과 4번에 해당하는 TestSummaryData[0]과 TestSets[0]의 값이 변경됐을 때 이를 바인딩 엔진에게 알려줄 추가적인 장치가 필요합니다.
이것이 바로 INotifyCollectionChanged이며 이를 구현해 놓은 자료구조가 ObservableCollection<T>입니다. List는 의 길이가 0인 상태에서 새로운 요소가 추가되거나 이미 인스턴스가 할당된 인덱스에 새로운 인스턴스를 지정할 때 이를 알려줄 방법을 제공하지 않습니다.
따라서 List<T> 형식으로 선언된 TestDataModel.TestSummaryData 속성과 TestSummary.TestSets 속성의 형식을 ObservableCollection<T>로 바꿔서 테스트 해보시기 바랍니다.
위 개념만 숙지하신다면 모델 깊이에 따른 바인딩 결정 요인이나 단계적 모델 설계에 대한 특별한 고려 사항은 없을 듯 합니다.