문제

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

깨끗한 방법으로 어떻게해야합니까?

도움이 되었습니까?

해결책

드롭 다운을위한 '위젯'인터페이스를 만들 수도 있습니다. 텍스트 상자 위젯에 대한 작업 코드의 쉬운 예를 제공하므로 아이디어를 얻을 수 있습니다.

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; }
}

지금까지 모든 것이 기술 불가지론입니다. 이제 Win Forms Textbox에 대한 구현이 있습니다.

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로 돌아가는 것은 또한 iview whole입니다.

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;
    }

아이디어를 얻으면 대부분의 작업이 상당히 기계적이기 때문에 설정보다 더 나빠 보입니다. 깨끗한 부분은 발표자가 실제 구현 된 위젯이 무엇인지 알거나 돌보지 않고 위젯에 필요한 정보를 얻거나 설정할 수 있다는 것입니다. 또한 동일한 유형의 다른 위젯 (라이브러리 구축)을 재사용 할 수 있으며 (여기서 승리 양식) 필요에 따라 다른 UI 기술 (인터페이스 / 기본 클래스가 있으면 다른 기술의 구현이 구현이 구현됩니다. 하찮은). 인터페이스가 있기 때문에 모의 물체로 쉽게 테스트 할 수 있습니다. 그리고 당신의 UI는 이제 UI 관련 작업을 제외한 거의 모든 것에 대해 놀랍게도 무지합니다. 단점은 위젯 당 다양한 클래스와 약간의 학습 곡선으로 편안합니다.

드롭 다운의 경우 선택한 indexChanged 유형 이벤트가 필요할 수 있습니다.

다른 팁

컨트롤러-뷰 interation이 너무 복잡해지면 보통 하위 제어기와 하위 뷰로 나뉩니다.

리피터의 항목을 자신의보기와 컨트롤러를 가진 사용자 제어로 만들 수 있습니다. 그런 다음 기본보기에는 기본 컨트롤러가 유지 관리하는 자체 컨트롤러가있는 서브 뷰 (USERCONTROLS) 목록이있을 수 있습니다.

사용자가 다음을 클릭하면 기본 컨트롤러가 모든 하위 제어기에게 자신의 뷰에서 항목을 새로 고치도록 신호를 보낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top