2008-11-06 79 views
1

我使用的监督控制器模式(模型视图演示)构建应用程序,我面临的一个困难。在我的页面中,我有一个中继器控件,它将显示我传递给它的每个集合的一个集合。 reapeater项目包含2个下拉列表,允许用户选择一个特定的值。当我点击下一个按钮时,我希望控制器检索这些值。模型视图演示和Repeater

我该怎么做,我一个干净的方式?

+0

你在什么语言构建你的应用程序? – 2016-06-28 13:03:30

回答

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

注意,到目前为止,一切都是技术无关。现在,这里是一个为赢的实现形式的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也是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; 
    } 

它看起来比设置更糟糕,因为大部分工作是相当机械的,一旦你明白了。干净的部分是,演示者可以获取(并设置)它在widget上需要的任何信息,而不需要知道或关心实际实现的widget是什么。它也适用于与其他窗口小部件(你最终构建它们的库)重复使用(在这里是Win Forms)和其他UI技术(一旦你有接口/基类,另一种技术的实现是不重要的)。因为您有界面,所以使用模拟对象进行测试也很容易。而你的用户界面现在完全不知道除了与用户界面相关的任何事外几乎所有的东西。不足之处在于每个小部件的一堆类以及一些学习曲线,以便使用它。

为了您的下拉菜单,你可能只是需要的SelectedIndexChanged类型的事件,你会取代这一例子TextChanged事件。

1

当控制器视图互为作用得到的太复杂,我通常他们分成子控制器和子视图。

您可以在转发的项目是有自己的看法和控制器用户控件。然后,您的主视图可以有一个子视图列表(用户控件),它们具有由主控制器维护的其自己的控制器。

当用户点击下一个你的主控制器可以通知所有的子控制器,从他们的观点刷新自己的项目。

相关问题