저는 INotifyPropertyChanged를 구현하는 Item 객체에 바인딩되는 DataGrid를 보유하고 있습니다.MVVM Datagrid가보기 및 모델에서 업데이트되었습니다.
ViewModel에서 Item 개체를 업데이트하는 외부 장치 서비스의 변경 내용을 구독합니다. DataGrid를 편집 할 수 있으므로보기에서 항목을 변경할 수도 있습니다. 값은 디바이스에 기록되어야하지만 디바이스 쓰기가 실패 할 수 있기 때문에 뷰에서 아직 갱신되지 않아야합니다. 성공하면 장치는 이미 구독 한 이벤트를 발행합니다.
내 관심사 중 일부는 다음과 같습니다.
장치 서비스, ViewModel 또는 Item 개체에서 쓰기는 어디서 호출해야합니까? 디바이스에서 이벤트를 수신 할 때까지 편집 후에 DataGrid에 표시된 값이 "되돌릴"수 있도록하는 방법은 무엇입니까?
어떤 생각
는 항목 객체의 경우, 다음 항목 객체는 더 이상 DTO 없지만, 오히려 ViewModel을 것 같아요. 따라서 동일한보기 (사용자 정의)에 대해 두 개의보기 모델을 갖게됩니다. 하나는 사용자 정의 컨트롤이고 다른 하나는 DataGrid의 항목입니다. 그것은 뷰 모델에 대한 나의 이해와 맞지 않습니다. 그러나 아마도 그것은 틀린가? 그런 다음 항목이 값 (사용자 별) 또는보기 모델 (장치 서비스 별)에서 업데이트되었는지 어떻게 알 수 있습니까?
ViewModel은 Item 객체의 PropertyChanged를 구독합니다. 값이 View에서 변경되었는지 감지하기 위해 ViewModel은 PropertyChanged의 등록을 취소하거나 서비스에서 이벤트를받을 때 플래그를 설정할 수 있습니다. 그것은 울퉁불퉁하지만 작동 할 것이다. 아마도 두 개의 속성, ViewValue 및 ServiceValue를 만들어야합니다. ViewModel은 ServiceValue를 업데이트하고 ViewValue에 가입해야합니다. ViewValue를 읽은 후에 ViewValue를 ServiceValue로 되돌릴 수 있습니다.
보기는 CellEditEnding을 처리하고 뷰 모델
IEditableObject는 좋게 들리 겠지만 좀 살펴 보겠습니다. 포인트 1에 관해, 아마도 나는 충분히 명확하지 않았다. 내 관심사는 "동일한"보기에 대한 두 개의보기 모델, 하나는 창, 하나는 창에있는 DataGrid의 항목에 대한 것입니다. 나는 viewmodel이 window/usercontrol에 속하며 DataGrid의 항목이 아니라고 생각합니다. 하지만 내 생각이 틀렸어? – Karsten
또한 DataGrid에 바인드 한 entity의 IEditableObject 인터페이스를 구현할 수 있습니다. 그것은 훨씬 더 많은 유연성을 줄 것입니다. –
Hmm은 DataGrid를 사용자 정의 컨트롤에 두는 것에 대해 중재합니다. 좋은 명확한 이름이 좋으므로 사용자 컨트롤의 이름을 지정하고 모델을 보는 방법을 알고 싶습니다. – Karsten