MVP: Как докладчик получает доступ к свойствам просмотра? - PullRequest
0 голосов
/ 02 октября 2011

Я приведу полный пример, который составляет:

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 от пользователей. Он должен быть доступен только докладчику. Это возможно? Я делаю что-то совершенно неправильно? Пожалуйста, сообщите!

1 Ответ

3 голосов
/ 02 октября 2011

Вы не можете полностью скрыть это от конечного пользователя, и, честно говоря, вам не нужно.Если кто-то хочет использовать ваш пользовательский элемент управления напрямую, он должен быть достаточно тупым, чтобы просто отображать свойства, установленные для него, независимо от того, были ли они установлены через докладчик.

Лучший вы однако может сделать (если вы все еще настаиваете на сокрытии этих свойств от своего пользователя), это реализовать 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);
    }

Таким образом, если кто-то просто делает:1010 *

у них не будет доступа к этим свойствам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...