2011-11-11 2 views
2

이것은 더 많은 개념적 질문입니다. 도움이된다면 MVVM 패턴에 해당한다고 말할 수 있습니다. WPF 바인딩에 대한 내 연구에서이 문제가 해결 된 것을 본 적이 없습니다.바인딩을 사용하여 WPF에서 업데이트 취소

바인딩을 통해 뷰 모델에 연결된 요소가있는 창이 있고 사용자가 레코드를 업데이트하지만 저장하기 전에 업데이트를 취소하기로 결정한 경우 변경 사항을 되돌리기위한 가장 좋은 방법은 무엇이라고 생각하십니까? "는 VM과시 사본에 바인딩 편집 팝업 메인 화면을 업데이트하는 사용자를 허용하는 대신

  1. 번째 창을 가지고

    나는 가능성의 몇 가지를 생각할 수 저장 "을 선택하면 해당 데이터가 원래 VM에 기록 된 다음 모델로 다시 업데이트됩니다. 저장 기능의 메모리 사용량과 복잡성이 증가합니다.

  2. 원본 VM 개체의 "원시"복사본을 만들고 "취소"할 때 해당 복사본을 원본 위에 다시 쓰십시오. 복사본을 삭제할 수 있습니다. 메모리 사용 및 취소 기능이 복잡해집니다.
  3. VM에서 생성시 변경 될 수 있고 "취소"시 변경 될 수있는 각 요소의 복사본을 생성 한 후 변경된 값 위에 다시 값을 씁니다. VM의 크기와 복잡성이 증가합니다.
  4. "취소"를 실행하면 VM이 데이터 소스에 도달하여 레코드를 다시로드합니다. 네트워크 트래픽과 DB 액세스 트래픽을 유발하고 디스플레이가 원래 상태로 다시 업데이트되는 데 걸리는 시간을 지연시킬 수 있습니다. 또한 VM이 다른 프로세스에서 업데이트되고 이러한 "외부"업데이트가 삭제되지 않아야하는 경우 문제가 발생할 수 있습니다.

누구나이 문제에 대한 더 나은 해결책을 생각하거나이 "자동"을 처리하는 WPF 내의 일부 모호한 기능을 알고 있습니까?

답변

2

필자는 ViewModels에 IEditableObject를 구현했으며 EditCommand를 호출하여 편집 모드로 들어갈 때 필드 사본을 만듭니다.

또한 편집을 확인할 때 호출 할 수있는 SaveCommands가 있습니다. 또는 CancelEdit 명령을 사용하여 복사 된 값으로 되돌립니다.

+0

리플렉션을 사용하여 멋진 속성과 간단한 속성으로 표시된 필드를 자동으로 저장/복원하는 기념일 구현을 사용합니다. –

+0

지루한 복사 코드를 작성할 필요가 없으므로 내 ViewModels을 생성하고 반사 느림 –

+0

반영의 가장 느린 부분은 유형별로 캐시 할 수있는 속성 정의를 얻는 것입니다. 그래도 자동 생성은 좋은 옵션입니다. –

0

중요한 것은 모델이 사용자 변경 사항을 롤백 할 수 있어야한다는 것입니다. 당신은 어떻게 그것을 진짜로 취향의 사정합니까. '원본'사본을 사용하여 변경되지 않은 상태로 되돌릴 수 있습니다 (모든 객체가 쉽게 복제 가능하지는 않습니다). 데이터베이스를 다시 질의 할 수 있습니다. 그러면 처음 시도했던 것과 다른 결과를 얻을 수 있습니다 편집. 이 문제에 대한 보편적 인 해결책은 없습니다.

3

이 작업을 수행하는 가장 쉬운 방법은 사용자가 명시 적으로 변경 내용을 커밋 할 때까지 VM에 대한 업데이트를 지연시키는 BindingGroup을 사용하는 것입니다. 이렇게하면 컨트롤이 변경된 값을 캐시에 저장하고 BindingGroup은 (변경되지 않은) VM에서 원래 값을 복원 할 수 있습니다.

+0

네. 이 방법에는 위에 열거 된 단점이 없습니다.불행히도 모델이나 적어도 ViewModel 내부에서 복잡한 검증을 수행하는 것이 더 낫기 때문에 객체 유효성 검사에 문제가 생길 수 있습니다. – Lu55

+0

ViewModel이 ICommand 구현을 노출 할 수있는 경우 왜 ValidationRules가 노출되지 않아야합니까? 예를 들어 ViewModel에서 정적 멤버로 ValidationRules을 구현할 수 있습니다. 특히 BindingGroup의 ValidationRules의 경우 ViewModel 인스턴스와 해당 비공개 멤버에 대한 액세스 권한을 얻을 수도 있습니다. – hbarck

관련 문제