2008-10-10 3 views
3

이것은 더 많은 디자인 질문입니다.비즈니스 개체가 변경 될 때 UI 자동 새로 고침

비즈니스 개체를 다양한 방법 (예 : 트리 노드, 목록보기 항목, 콤보 상자, 텍스트 필드 등)으로 표시하는 도구를 작성하고 있습니다. g 용자가 이들 중 하나를 변경할 때마다 해당 Business Object가 변경되었거나 해당 Business Object가 속한 콜렉션이 변경되었음을 알리는 이벤트가 발생합니다. 이 Business Object 또는 해당 Business Object가 속할 수있는 콜렉션이 두 개 이상의 위치에 표시 될 수 있으 G로, 각 UI 요소를이 변경 사항을 반영하도록 갱신해야합니다. 변경시 각 유형의 UI 요소가 올바르게 업데이트되도록하는 우아한 솔루션이 있습니까?

이 작업을 수행하는 방법에 대한 아이디어가 몇 가지 있지만 누구나이 문제가있어 솔루션에 만족하는지 확인하고 싶습니다. 이것은 C# WinForm이지만 솔루션은 모든 언어가 될 수 있습니다. 문제와 해결 방안에

나의 현재의 생각 :

당신이 이벤트 바인딩을 정리할 때 더 복잡해진다 (즉 businessObject.Changed - = ObjectChanged) 비즈니스 오브젝트는 TreeNodeCollection의 일부가/ListViewITemCollection/ComboBoxItemCollection 및 Clear()가 컬렉션에서 호출됩니다.

각 개체와 해당 UI 요소가 등록 될 수있는 위치, 비즈니스 개체의 이벤트를 한 위치에서 수신 할 수있는 위치 및 이벤트 발생시 각 UI 요소가 업데이트되는 것은 어떻습니까? 모든 UI 요소의 등록이 해제되면 해당 개체의 이벤트에 대한 구독이 제거됩니다.

이 솔루션의 문제점은 모든 컨트롤이 모든 생성시 UI 구성 요소와 개체를 등록하는 데 책임 져야한다는 점입니다. 이는 지저분해질 수 있습니다.

의견이 있으십니까?

+0

를 원하는 것입니다. –

답변

2

메시징 시스템을 사용하십시오. 속성이 변경 될 때

public event ObjectRefresh; 

을 그리고 : 당신의 BusinessObject 클래스에서, 그리고

public delegate void ObjectRefresh(BusinessObject obj); 

이 같은 대리자를 만들기

if (ObjectRefresh) 
    ObjectRefresh(this); 

그리고 당신의 UI를 모두에 :

BusinessObject obj = GetBusinessObject(); 
obj.ObjectRefresh += this.ObjectRefresh; 
... 
private void ObjectRefresh(BusinessObject obj) 
{ 
    // update UI 
} 

:

+0

OnObjectRefresh라는 자체 (보호 된) 메서드에서 대리자를 호출하는 코드를 넣는 것이 좋습니다. –

0

있는지 확인 당신이 정말 필요, 즉이미 그런 일이 일어나지 않았다고. 예를 들어 GUI 개체가 데이터 집합에 바인딩되고 비즈니스 개체가 변경 내용을 데이터 집합으로 병합하는 경우 데이터 집합은 데이터가 변경되었음을 GUI 개체에 자동으로 알립니다. 데이터베이스 GUI 개체가 자동으로

없는 경우 자동으로 업데이트됩니다 다음, 상기 한 바와 같이 옵저버 패턴은 내가 디자인 패턴이 거기에 꽤 확신