首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型视图Presenter和Repeater

模型视图Presenter和Repeater
EN

Stack Overflow用户
提问于 2008-11-06 14:43:47
回答 2查看 988关注 0票数 1

我正在使用Supervising模式(Model View Presenter)构建一个应用程序,并且我面临着一个困难。在我的页面中,我有一个中继器控件,它将显示我传递给它的集合中的每一项。reapeater项包含2个下拉列表,允许用户选择特定值。当我单击next按钮时,我希望控制器检索这些值。

我怎样才能做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-20 09:04:58

你也可以为下拉菜单创建一个'widget‘界面。我将为您提供一个简单的TextBox小部件代码示例,这样您就可以理解了。

代码语言:javascript
复制
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的实现:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public partial class ProjectPickerForm : Form, IProjectPickerView
{

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

在演示者中:

代码语言:javascript
复制
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相关的任务。缺点是每个小部件都有大量的类,并且需要一点学习曲线来适应它。

对于您的下拉列表,您可能只需要SelectedIndexChanged类型的事件,您可以将其替换为本例中的TextChanged事件。

票数 2
EN

Stack Overflow用户

发布于 2008-11-06 15:13:30

当控制器-视图交互太复杂时,我通常将它们分成子控制器和子视图。

您可以让中继器中的项成为拥有自己的视图和控制器的用户控件。然后,您的主视图可以有一个子视图(用户控件)列表,这些子视图具有自己的控制器,这些控制器由主控制器维护。

当用户单击next时,您的主控制器可以向所有子控制器发出信号,让它们刷新视图中的项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/268923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档