2008-11-06 9 views
1

감독자 패턴 (Model View Presenter)을 사용하여 응용 프로그램을 작성하고 있으며 어려움에 직면하고 있습니다. 내 페이지에는 전달할 컬렉션의 각 항목을 표시하는 리피터 컨트롤이 있습니다. 리피터 항목에는 사용자가 특정 값을 선택할 수있는 2 개의 드롭 다운 목록이 있습니다. 다음 버튼을 클릭하면 컨트롤러가 그 값을 검색하도록합니다.모델보기 발표자 및 리피터

내가 어떻게하면 좋을까요?

+0

응용 프로그램을 작성한 언어는 무엇입니까? –

답변

2

드롭 다운에 '위젯'인터페이스를 만들 수도 있습니다. 아이디어를 얻을 수 있도록 TextBox 위젯에 대한 몇 가지 작업 코드 예제를 제공 할 것입니다.

public interface ITextWidget 
{ 
    event EventHandler TextChanged; 
    string Text { get; set; } 
} 

public abstract class TextWidget<T> : ITextWidget 
{ 

    protected T _wrappedWidget { get; set; } 
    public event EventHandler TextChanged; 

    protected void InvokeTextChanged(object sender, EventArgs e) 
    { 
     var textChanged = TextChanged; 
     if (textChanged != null) textChanged(this, e); 
    } 

    public abstract string Text { get; set; } 
} 

지금까지 모든 것이 기술에 영향을받지 않음을 유의하십시오. 이제 여기에 승리의 구현 양식의 텍스트 상자 :

public class TextBoxWidget : TextWidget<TextBox> 
{ 

    public TextBoxWidget(TextBox textBox) 
    { 
     textBox.TextChanged += InvokeTextChanged; 
     _wrappedWidget = textBox; 
    } 

    public override string Text 
    { 
     get { return _wrappedWidget.Text; } 
     set { _wrappedWidget.Text = value; } 
    } 
} 

이것은 다시 MVP로도 IViewWhatever 인 양식 자체에서 인스턴스화됩니다 :

public partial class ProjectPickerForm : Form, IProjectPickerView 
{ 

    private IProjectPickerPresenter _presenter; 
    public void InitializePresenter(IProjectPickerPresenter presenter) { 
     _presenter = presenter; 
     _presenter.InitializeWidgets(
      ... 
      new TextBoxWidget(txtDescription)); 
    } 
      ... 
} 

그리고 발표자의 :

public class ProjectPickerPresenter : IProjectPickerPresenter 
{ 
    ... 
    public void InitializeWidgets(ITextWidget descriptionFilter) { 

     Check.RequireNotNull<ITextWidget>(descriptionFilter, "descriptionFilter"); 
     DescriptionFilter = descriptionFilter; 
     DescriptionFilter.Text = string.Empty; 
     DescriptionFilter.TextChanged += OnDescriptionTextChanged; 

    } 
    ... 

    public void OnDescriptionTextChanged(object sender, EventArgs e) { 
     FilterService.DescriptionFilterValue = DescriptionFilter.Text; 
    } 

일단 아이디어를 얻으면 대부분의 작업이 상당히 기계적이기 때문에 설정하는 것보다 나빠집니다. 깔끔한 부분은 발표자가 실제 구현 된 위젯이 무엇인지 알지 못하거나 신경 쓰지 않고 위젯에 필요한 정보를 가져올 수 있다는 것입니다. 또한 다른 유형의 위젯 (여기에서는 Win Forms)과 다른 UI 기술 (필요한 인터페이스/기본 클래스가 있으면 다른 기술에서의 구현은 다음과 같습니다)을 사용하여 다른 위젯과 재사용 할 수 있습니다. 하찮은). 또한 인터페이스가있어서 모의 객체로 테스트하기 쉽습니다. 그리고 UI는 이제 UI 관련 작업뿐 아니라 모든 것에 대해 멋지게 무지합니다. 단점은 위젯 당 클래스의 무리와 그것에 익숙해지기위한 약간의 학습 곡선입니다.

드롭 다운의 경우이 예제 TextChanged 이벤트 대신 사용할 수있는 SelectedIndexChanged 유형 이벤트 만 필요할 수 있습니다.

1

컨트롤러보기 간섭이 너무 복잡해지면 대개 하위 컨트롤러와 하위보기로 분할됩니다.

리피터의 항목을 자체보기 및 컨트롤러가있는 사용자 정의 컨트롤로 설정할 수 있습니다. 메인 뷰에는 메인 컨트롤러가 유지 관리하는 자체 컨트롤러가있는 하위 뷰 (사용자 정의 컨트롤) 목록이 있습니다.

사용자가 다음을 클릭하면 주 컨트롤러가 모든 하위 컨트롤러에 신호를 보내 해당보기에서 항목을 새로 고침 할 수 있습니다.