我正在实现一个简单的UserControl,它实际上是一个高级的TextBox。其中之一的功能是您可以设置格式规范,这些格式规范会自动应用于其内容。例如,如果您将格式规范设置为“000”,并且内容为“42”,那么“042”将出现。
我按照MVP模式来实现这个UserControl。该实现类似于此:如何在winforms mvp模式中实现usercontrol?。另请查看此问题:被动视图和显示逻辑 方法1:
我的View中的Title属性如下:
这段代码应该在
我按照MVP模式来实现这个UserControl。该实现类似于此:如何在winforms mvp模式中实现usercontrol?。另请查看此问题:被动视图和显示逻辑 方法1:
我的View中的Title属性如下:
private string title;
public string Title {
get { return title; }
set { title = value; titleTextBox.Text = presenter.Format(title); }
}
我认为这个实现增加了不必要的耦合。例如,如果我更改“Presenter”的“Format”方法,那么我将不得不查看所有的“View”并相应地更改调用语句。
方法二
我的“View”中的“Title”属性如下:
public string Title {
get { return presenter.Title; }
set { presenter.Title = value; }
}
我的Presenter
中Title
属性的代码如下:
private string title;
public string Title {
get { return title; }
set { _view.SetTitle(this.Format(value); }
}
现在我需要在View
接口和View
实现中添加SetTitle
方法:
public void SetTitle(string title) {
titleTextBox.Text = title;
}
因此,采用这种方法我得到了一个类似Java的丑陋的SetTitle
方法。
第三种方法
不要调用SetTitle
,而是在View
中创建一个新的属性RealTitle
并设置它。这个Real
前缀使得它仍然很丑陋。
你的方法
你能想到更好的方法吗?
使用场景
UserControl
应该像这样使用:
var c = new FancyTextBox();
c.Format = "000";
c.Text = "42";
Controls.Add(c);
这段代码应该在
UserControl
中显示"042"
。
总体情况
Form FancyTextBoxView FancyTextBoxPresenter
| | |
| ftb.Text = "42" | |
|-------------------->| |
| | |
| | A |
| |----------------------------->|
| | |
| | B |
| |<-----------------------------|
A和B是什么操作?我希望格式化的文本出现在UI中。格式化代码位于Presenter
中。View
有一个titleTextBox
,将在UI中显示文本。
UserControl
没有公开Format
方法。这是Presenter
的一个方法。用户只能设置Title
或Format
。当用户更改其中一个时,应该发生什么? - prekageo