2009-09-17 7 views
1

DataGrid을 사용하는 MVVM 기반 WPF 응용 프로그램에서 작업하고 있습니다. 표는 ObservableCollection<Widget> (Widget 목록)에 데이터 바인딩됩니다. 사용자는 현재 선택된 Widget 아래의 목록에 Widget을 삽입하고, 선택된 Widget을 삭제하고, 그리드의 Widget을 재정렬 할 수 있어야합니다. 끌어서 놓기를 통해 재정렬을 구현합니다.WPF DataGrid 모범 사례?

내가 이것을 파고 들기 전에, 나는 나의 접근법에 대해 현실적인 점검을하고 싶다. 내가하고자하는 것은 다음과 같습니다. Widget 클래스는 Index 속성을 사용하여 Widget 목록을 주문합니다. 추가, 삭제 및 재정렬은이 Index 속성을 조작하여 수행되며 정렬은 CollectionView이 아닌 Widget 목록에서 수행됩니다.

DataContext이 설정되기 전에 Widget 목록은 Index 속성으로 정렬됩니다. 사용자가 Widget을 추가하면 Index 속성은 그리드에서 선택된 항목 아래의 각 Widget에 대해 1 씩 증가하며 새로 번호가 매겨지면서 열리는 인덱스 번호는 Widget입니다. Widget 목록이 사용되며 바인딩이 새로 고쳐집니다.

사용자가 Widget을 삭제

Widget 목록에서 제거 및 Widget 목록에 의존 할 것이다 항목의 Index 특성 (1)에 의해 감소 ​​될 삭제 된 항목 아래의 그리드에, 그리고 바인딩을 새로 고쳐집니다 , 위와 같이. 재정렬은 조합 삭제 및 삽입으로 수행됩니다.

제 질문은 삽입, 삭제 및 재정렬을 구현하기위한 합리적인 전략입니까? 그것에 대해 갈 수있는 더 좋은 방법이 있습니까? 주제에 대한 좋은 기사 또는 블로그 게시물? 나는 보았다. 그러나 나는 온 - 포인트를 생각해 내지 못했다.

도움 주셔서 감사합니다.

답변

1

나는이 문제가 알아 낸 있어요. Index 속성이 필요하지만 ObservableCollection을 정렬 할 필요가 없습니다. 하나의 속성 인 Index가있는 IIndexedObject 인터페이스를 만듭니다. 인덱스가 필요한 모든 개체에 해당 인터페이스를 구현하고 데이터베이스 테이블에서 인덱스 열을 추가합니다.

개체 모델을로드 할 때 인덱스 속성에서 데이터베이스 테이블을 정렬합니다. 이렇게하면 마지막 실행시와 동일한 순서로 목록이로드됩니다. DataGrid의 맨 아래에 제공된 빈 행을 사용하여 객체를 추가합니다. 그들에게 0의 인덱스를 부여합니다. 뷰 모델에서 ICommand에 바인드 된 Delete 단추를 사용하여 오브젝트를 삭제합니다.

내 뷰 모델은 IIndexedObjects가 포함 된 ObservableCollection의 CollectionChanged 속성을 구독합니다. 이벤트가 발생하면 뷰 모델은 컬렉션을 IIndexedObject를 사용하는 ReIndexCollection 서비스 메서드로 전달합니다. 메서드는 컬렉션을 반복하여 각 요소의 Index 속성에 증분 정수 값을 할당하여 현재 순서에 따라 컬렉션을 다시 인덱싱합니다. 컬렉션을 데이터베이스에 다시 저장하면 인덱스 값이 저장되어 컬렉션이 다음 실행시 동일한 순서로로드됩니다.

필요한 정렬 만 데이터베이스로드에서 수행되므로 ObservableCollection을 정렬 할 필요가 없습니다.DataGrid에서 항목을 이동하면 해당 시간에 컬렉션을 다시 정렬 할 수 있습니다. 필자가해야 할 일은 콜렉션의 색인을 다시 잡아서 그 순서가 데이타베이스에 다시 저장되도록하는 것뿐입니다.

전체적으로 예상했던 것보다 훨씬 쉽습니다. WPF 및 MVVM을 좋아하는 이유 중 하나입니다.