2009-10-06 4 views
1

최근에 C#에서 데이터 바인딩을 사용 해왔고, 내가하는 일이 간단하고 효과적이지만 최선의 방법이라고 생각하지 않습니다.데이터 바인딩 컨트롤, 캡슐화를위한 모범 사례

class UserManager 
{ 
    public IList<User> Users { get; ...} 
    public AddUser(...) 
    public RemoveUser(...) 
} 

그래서 AdduserRemoveUser가 출력으로 Users 컬렉션 목록을 제어해야합니다 :

예를 들어, 나는 다음과 같은 인터페이스를 가지고 관리자 클래스, 즉 UserManager 있습니다.

listBindingSource.DataSource = userManager.Users; 

내가 다음

listBindingSource.Add(new User(...)) 

이것은 물론 작동 즉, 바인딩을 통해 목록을 조작하고,하지만 난 완전히 UserManager을 우회하고있다 : 나는 즉, 바인딩이 컬렉션을 사용하고 AddUser/RemoveUser 기능이 있습니다! 물론 이것은 매우 잘못된 것 같습니다. 데이터 바인딩을 사용하는 올바른 방법은 무엇입니까?

UserManager은 lib 디렉토리에 있으므로 바인딩 객체를 넣고 싶지 않습니다. GUI 객체 여야한다고 생각합니다. 반면 바인딩을 사용하면 내 GUI가 내 컬렉션을 완전히 제어 할 수 있습니다.

답변

1

코드가 이제 서서 당신이하는 일을 할 수 없습니다. 어떤 시점에서 컬렉션은 IBindingList 인터페이스를 지원해야합니다 (이는 양식에있는 BindingSource 개체가하는 것입니다). UserManager 클래스를 사용하여 조작을 수행하려는 경우 속성의 내부 데이터 저장소를 BindingList<User>으로 변경해야합니다 (이 경우에도 IList<User>으로 입력 한 값을 반환 할 수 있어야합니다. 이제 실제 구체적인 구현을 BindingList<User>으로 변경하십시오. 이렇게하면 IBindingList 인터페이스가 눈금에 노출되어 다른 곳에서 변경 한 사항, 즉 UserManager 클래스의 변경 사항을 감지합니다.

목록에 포함 된 개별 요소가 아닌 목록에 대한 변경 사항 만 적용됩니다 (즉, 추가 및 제거가 UI에 반영되지만 수정 사항이 적용됨). ''). 이를 수행하기 위해서는 User 클래스에 IPropertyChanged을 구현해야합니다 (아직이 아니라고 가정).

+0

고맙습니다. 아주 좋은 정보입니다. BindingList로 내부 목록을 지정해야하는 것에 약간의 관심이 있습니다. 사용 방법을 알 필요가 없어야한다고 생각하기 때문입니다. 하지만 대안은 중급 변환 레이어라고 생각합니다.이 레이어는 소규모 프로젝트에서 가치가 없습니다. – DanDan

+0

'BindingList'는 프리젠 테이션에 의존하지 않도록 설계되었습니다. 이는 변화를 감지하는 데 필요한 인프라를 제공하는 것뿐입니다. 어떤 데이터 바인딩 시나리오를 사용하든 관계없이 데이터 변경 내용이 GUI에 자동 반영되도록 변경 내용 추적 (또는보다 정확하게 * 변경 알림 *) 시스템이 있어야합니다. 'BindingList '사용에 대해서는 "냄새 나는"것이 없습니다. –