2

내 컬렉션과 DataGridView간에 양방향 데이터 바인딩을 제공하려면 UI에 BindingList가 필요합니다. 그러나 비즈니스 계층 (또는 도메인 계층, 서비스 계층, 데이터 계층 등)에서 BindingList를 반환하는 것이 올바르지 않은 것 같습니다. 즉, UI 요구 사항 때문에 BindingList 만 사용하고 있었고 이제는이 UI 요구 사항이 내 도메인 계층과 결합됩니다.비즈니스 계층 (또는 서비스 계층, 도메인 모델 등)에서 BindingList를 반환해야합니까?

"적절한"분리 방법은 무엇입니까? 내가 IList를 반환해야하고 프레 젠 테이션을 목적으로 BindingList에 복사해야합니까? 현실 세계의 관점에서 볼 때,이 오버 헤드는 가치가 있습니까?

+0

이 질문은 실제로 WPF를 사용하여 MVVM을 사용하는 방법을 모색하게되었습니다. 나는 그것에 들어가기 만하고 있지만 나는 그것을 좋아한다. – User

답변

0

도메인 계층이 더 일반적인 유형을 반환하고 (ObservableCollection<>) 또는 (IEnumerable<> 또는 IList<>)인지 여부가 요구 사항에 달려 있다고 생각합니다.

UI 레이어는 기능을 필요로하는 경우 IBindingList에 원하는대로 (또는 UILD 레이어를 원하는대로) 변환 할 수 있습니다.

우리는 BindableLinq을 사용하여 UI 레이어에서/필터 된 바인딩 목록을 알려주는 목표를 달성하는 데 큰 성공을 거두었습니다.

1

"적절한"방법이 무엇인지 모르겠지만 CSLA와 같은 프레임 워크를 사용했고 비즈니스 목록에 ObservableCollection을 사용했습니다. UI에서 항목을 추가하거나 목록에서 제거 할 때 UI가 업데이트되므로 UI의 비즈니스 개체를 매우 간단하게 사용할 수 있습니다. IList를 반환 한 다음 BindingList에 복사하면 IList에 대한 변경 사항을 수동으로 모니터링하고 변경 사항을 처리하고이를 BindingList로 변환해야합니다. 내 개인적인 취향은 BindingList 또는 ObservableCollection을 사용하여 비즈니스 계층을 UI에 표시하는 가능한 경우 풍부한 기능의 비즈니스 계층을 만드는 것입니다.

+0

내 문제는 웹 사이트를 통해 동일한 데이터를 노출하면 바인딩 목록에 웹 컨텍스트가 없거나 제한적으로 사용된다는 것입니다. – User

2

IList를 복사 할 필요가 없습니다 (적어도 사본/복제본을 만들고 싶지는 않길 바랍니다). 일반적으로 할 일은 동일한 IList 객체에 또 다른 참조를 만드는 것입니다. 따라서 IList 객체를 반환하는 것은 아무런 문제가되지 않습니다.

예를 들어 다음과 같이 반환 할 수 있습니다. List 객체를 가져 와서 UI에있는 bindingList 밖으로 REFER합니다.

제 생각에는 BindingList보다 IList (List, HashTable aso) 객체를 반환하는 것이 좋습니다. 다른 UI (Console, Web, Win, Service)에서 사용할 수 있습니다. 예 : bindingList를 사용하면 웹 응용 프로그램에서 이점이 없습니다.

+0

Winforms에서 DataGridView와 함께 IList를 사용하면 IList의 변경 사항이 UI에 반영 될 것을 어떻게 제안합니까? – User

+0

내 게시물을 잘못 이해했다고 생각합니다. UI 레이어에서 BindingList를 사용해야합니다. 그러나 도메인 계층에서는 IList 또는 다른 것을 제안합니다. 이 점을 분명히하기 위해서 : D –

+1

아하나. "복사 안함"에 대한 귀하의 의견에 IList (예 : var x = new BindingList (myIList))에서 UI 레이어에 BindingList를 작성한다고 가정합니다. 이 목록을 효과적으로 복사하지 않습니까? Microsoft 설명서에이 작업의 시간은 O (n)이 아님을 나타냅니다. O (1) – User

0

이벤트 요소 처리기를 구현하지 않고 UI 요소에서 비즈니스 모델을 편집하도록하려면 비즈니스 모델에 BindingList가 있어야합니다.

언제든지 new BindingList<MyWidget>(list)과 같은 작업을 수행하면 바인딩을 루트 목록에서 분리합니다. 항목을 편집하면 모두 잘 작동하지만 추가 및 삭제는 원래 목록에 반영되지 않습니다.

최근 BindingList 변경 사항을 반영하도록 내 모델을 업데이트 한 BindingList ListChanged 이벤트를 사용하여이 같은 구현을 시도했지만 UI에서 BindingList를 업데이트하지 않은 컨트롤러가 모델을 변경했습니다.

목록에 항목을 추가하거나 제거 할 때마다 이벤트를 발생시키는 특수 접근자를 생성 할 수 있지만 BindingList를 다시 오버 헤드로 다시 구현하는 것입니다.