2010-01-22 1 views
3

사용자 인터페이스에서 일부 엔터티를 편집 할 때 취소 단추를 구현해야하는 경우가 종종 있습니다. WPF에서보기 모델을 트랜잭션으로 만들면 좋을 것입니다. 좀 더 자세히 설명하려고합니다 :.NET의 트랜잭션 객체

뷰 모델은 모델에 연결되어 있고 뷰 (데이터 바인딩 활용)에서 다루기 쉬운 방식으로 데이터를 노출합니다. 뷰 모델을 변경하면 모델이 변경됩니다. 그러나 취소 버튼이있는 경우 일반적으로 모델에서 즉시 변경을 수행하지 않으므로 어떤 종류의 버퍼링 변경 사항이 있다고 생각합니다. 변경 사항을 커밋하면 모델로 전송되고 그렇지 않으면 삭제됩니다.

지금은 실제보기 모델 대신보기에 바인딩 된보기 모델의 프록시를 만드는 솔루션을 구현했습니다. 프록시는 모델에 연결되어 있지 않지만 인터셉터를 사용하여 속성 및 메서드 호출에 대한 변경 사항을 기록합니다. 실제 뷰 모델에 호출을 적용하는 제출 메소드가 있습니다. 꽤 좋은 해결책이라고 생각하지만 여전히 뷰 모델에 콜렉션이 포함되어 있다면 꽤 버그가 있습니다.

저는 이런 종류의 작업을 수행하는 프레임 워크를 찾고 있습니다. 저 밖에있어?

최고 감사합니다,
올리버 Hanappi

답변

1

BindingGroups은 Binding 유효성 검사를위한 것이 아닙니다. BindingGroup의 BeginEdit, CommitEdit 및 CancelEdit을 사용하여 트랜잭션 논리를 사용할 수 있습니다. 순수한 MVVM 유형이라면 문제가 될 수있는 한 가지가 있습니다.보기에서 코드 숨김을 얻을 가능성이 높습니다. 그렇지 않으면 매력처럼 작동합니다.

+0

힌트를 보내 주셔서 감사합니다. 모델을 컬렉션이 포함되지 않은 경우에만 사용할 수 있다고 생각합니다. 그래도 여전히 완벽하지는 않지만 좋은 접근 방법입니다. –

2

당신은 사샤 이발사로 Cinch MVVM Framework 좀 걸릴 수 있습니다.

이 뷰의 변화는 때까지 모델에 모든 방법을 전파되지 않도록 당신은, 바인딩 중 하나를 해제 할 수 있습니다

1

"를 IEditableObject 사용은 편집을 취소/편집에 복원/객체 상태를 저장하기 위해"제공 그것을 (수동으로)하십시오. 이것은 당신이 이미 한 것입니다. 또한 업데이트가 통과하도록 허용 할 수 있지만 사용자가 취소 할 경우 데이터베이스에서 개체를 다시로드하십시오.

다른 옵션으로 변경 내용을 롤백하기 위해 IEditableObject를 구현하는 방법이 있습니다. http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx 중요하지 않은 개체의 전체 복사본을 만들 때 항상 즐겁지는 않습니다.

당신의 솔루션은 괜찮다고 생각하지만, 왜 컬렉션에 버그가 있는지 궁금합니다.