C# MVP:演示者如何访问视图属性?
我将给出一个完整的示例,其中包括:C# MVP:演示者如何访问视图属性?,c#,.net,winforms,mvp,C#,.net,Winforms,Mvp,我将给出一个完整的示例,其中包括: using System.Windows.Forms; interface IView { string Param { set; } bool Checked { set; } } class View : UserControl, IView { CheckBox checkBox1; Presenter presenter; public string Param { // SKIP THAT: I
using System.Windows.Forms;
interface IView {
string Param { set; }
bool Checked { set; }
}
class View : UserControl, IView {
CheckBox checkBox1;
Presenter presenter;
public string Param {
// SKIP THAT: I know I should raise an event here.
set { presenter.Param = value; }
}
public bool Checked {
set { checkBox1.Checked = value; }
}
public View() {
presenter = new Presenter(this);
checkBox1 = new CheckBox();
Controls.Add(checkBox1);
}
}
class Presenter {
IView view;
public string Param {
set { view.Checked = value.Length > 5; }
}
public Presenter(IView view) {
this.view = view;
}
}
class MainClass {
static void Main() {
var f = new Form();
var v = new View();
v.Param = "long text";
// PROBLEM: I do not want Checked to be accessible.
v.Checked = false;
f.Controls.Add(v);
Application.Run(f);
}
}
这是一个非常简单的应用程序。它有一个MVP用户控件。此用户控件具有控制其外观的公共属性Param
我的问题是我想对用户隐藏
Checked
属性。它只能由演示者访问。可能吗?我做的事情完全不对吗?请告知 您不能对最终用户完全隐藏它,老实说,您不需要这样做。如果有人想直接使用您的用户控件,则您的控件应该足够笨,以便只显示在其上设置的属性,而不管这些属性是否通过演示者设置
但是,您能做的最好的事情(如果您仍然坚持对用户隐藏这些属性),就是显式地实现IView
:
class View : UserControl, IView {
CheckBox checkBox1;
Presenter presenter;
string IView.Param {
// SKIP THAT: I know I should raise an event here.
set { presenter.Param = value; }
}
bool IView.Checked {
set { checkBox1.Checked = value; }
}
public View() {
presenter = new Presenter(this);
checkBox1 = new CheckBox();
Controls.Add(checkBox1);
}
这样,如果有人这样做:
var ctl = new View();
他们将无法访问这些属性。您不能对最终用户完全隐藏它,老实说,您不需要这样做。如果有人想直接使用您的用户控件,则您的控件应该足够笨,以便只显示在其上设置的属性,而不管这些属性是否通过演示者设置 但是,您能做的最好的事情(如果您仍然坚持对用户隐藏这些属性),就是显式地实现
IView
:
class View : UserControl, IView {
CheckBox checkBox1;
Presenter presenter;
string IView.Param {
// SKIP THAT: I know I should raise an event here.
set { presenter.Param = value; }
}
bool IView.Checked {
set { checkBox1.Checked = value; }
}
public View() {
presenter = new Presenter(this);
checkBox1 = new CheckBox();
Controls.Add(checkBox1);
}
这样,如果有人这样做:
var ctl = new View();
他们将无法访问这些属性。+1表示您不需要麻烦。代码审查应该能够发现这种滥用:)但是如果用户通过
IView
而不是视图来引用它,那么用户将有权访问它,而IView视图=新视图()代码>..+1表示您不需要麻烦。代码审查应该能够发现这种滥用:)但是如果用户通过IView
而不是视图来引用它,那么用户将有权访问它,而IView视图=新视图()代码>。。。