我正在使用Supervising模式(Model View Presenter)构建一个应用程序,并且我面临着一个困难。在我的页面中,我有一个中继器控件,它将显示我传递给它的集合中的每一项。reapeater项包含2个下拉列表,允许用户选择特定值。当我单击next按钮时,我希望控制器检索这些值。
我怎样才能做到这一点呢?
发布于 2009-07-20 09:04:58
你也可以为下拉菜单创建一个'widget‘界面。我将为您提供一个简单的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; }
}请注意,到目前为止,一切都是技术不可知的。下面是一个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也是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相关的任务。缺点是每个小部件都有大量的类,并且需要一点学习曲线来适应它。
对于您的下拉列表,您可能只需要SelectedIndexChanged类型的事件,您可以将其替换为本例中的TextChanged事件。
发布于 2008-11-06 15:13:30
当控制器-视图交互太复杂时,我通常将它们分成子控制器和子视图。
您可以让中继器中的项成为拥有自己的视图和控制器的用户控件。然后,您的主视图可以有一个子视图(用户控件)列表,这些子视图具有自己的控制器,这些控制器由主控制器维护。
当用户单击next时,您的主控制器可以向所有子控制器发出信号,让它们刷新视图中的项。
https://stackoverflow.com/questions/268923
复制相似问题