2012-06-05 3 views
2

여기 http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx에서 발췌입니다 :DataGrid에서 IEditableObject를 어떻게 사용합니까?

5.Data 소스 항목은 트랜잭션 편집 기능을 얻을 IEditableObject를 구현해야합니다.

IEditableObject에 익숙하지 않은 분은 좋은 설명과 코드 샘플이 포함 된 MSDN 문서를 참조하십시오. DataGrid는 을 IEditableObject 인터페이스를 통해 트랜잭션 편집 기능에 구운 것입니다. 셀 편집을 시작하면 DataGrid는 셀 편집 모드와 행 편집 모드 인 에 들어갑니다. 이것이 의미하는 바는 이 셀을 취소/확정하고 행을 취소/확정 할 수 있다는 것입니다. 예를 들어, I 셀 0을 편집하고 탭을 눌러 다음 셀로 이동합니다. 탭을 누르면 셀 0이 커밋됩니다. 셀 1에서 타이핑을 시작하고 취소 작업을 실현하고 싶습니다. 작업을 취소하십시오. 나는 'Esc'를 눌러 셀 1을 되돌립니다. 이제 이 전체 작업을 취소하려고하므로 'Esc'를 다시 누르면 셀 0이 원래 값으로 되돌려집니다.

IEditableObject를 구현하지 않아도 동일한 트랜잭션 동작이 발생합니다. 내가 뭘 놓치고 있니?

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Description { get; set; } 
    } 

    People = new List<Person> { 
    new Person(){FirstName = "fname", LastName = "lname", Description = "description"} 
    }; 

    <DataGrid ItemsSource="{Binding Path=People}" /> 

답변

2

물론 메모리의 간단한 문자열에 대해서는별로 중요하지 않습니다. 그러나 IEditableObject에 대한 용도가 있습니다.
예를 들어, 편집 된 모든 레코드를 데이터베이스에 저장하려고한다고 가정합니다. 하나의 트랜잭션에서 모든 변경 사항을 커밋하고 싶다면 EndEdit()이됩니다. 다른 인터페이스 방법에도 비슷한 용도가 있습니다.

또한 항상 바운드 개체를 직접 편집하는 것은 아닙니다. IEditableObject 인스턴스에는 실제 데이터 소스 인 다른 유형의 변수가있을 수 있습니다. 이 경우 EndEdit()이 호출 될 때까지 편집 된 값을 적용하지 않고 CancelEdit()은 원래 데이터 소스의 값을 복원합니다.

+0

데이터베이스 작업이 실패하면 어떻게됩니까? EndEdit()은 데이터베이스 작업을 수행하기에 좋은 장소라고 생각하지 않습니다. – alice

+0

@alice 그런 다음 오류를 적절히 처리해야합니다. 그것은 데이터베이스 일 필요는 없지만 다른 메모리 내 객체이거나 변경이 최종적으로 끝날 때까지 다른 사람이 손댈 수 없도록하려는 다른 객체 일 수도 있습니다. 단 몇 개의 문자열 속성을 가진 일반 객체를 사용하는 것은 IEditableObject의 좋은 예가 아닙니다. – Botz3000

관련 문제