Что если я хочу, чтобы только один класс имел доступ к элементам управления моей формы? - PullRequest
1 голос
/ 18 августа 2011

Я реализовал систему Undo / Redo в своем приложении, но, поскольку это отдельный класс от моей основной формы, он не может получить доступ ни к одному из своих элементов управления.В настоящее время я передаю все элементы управления, которые необходимо отменить или повторить, в конструктор класса, но он быстро становится одним из крупнейших конструкторов в моем проекте.

Было бы хорошо, если бы только этот класс был разрешен для доступак контролю моей формы.Если я передам форму конструктору, я все равно не смогу получить доступ к элементам управления, потому что они все закрытые.Я полагаю, что простым решением было бы сделать все необходимые мне элементы управления общедоступными, но каково идеальное или элегантное решение?

PS Я уже читал о методике обладания публичным свойством для всего необходимого и передачив форме для конструктора, но в конечном итоге это будет довольно много свойств, и решение кажется не очень применимым в этой ситуации.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Очень, очень, очень редко рекомендуется передавать элементы управления или формы UI в класс. Это просто кошмар обслуживания / зависимости в процессе разработки.

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

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

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

Для картины на память.

Простой объект содержит состояние, которое вы хотите сохранить ....

 internal class Memento: IMemento
    {
        private object _state;

        public void SetState(object state)
        {
            _state = state;
        }

        public object GetState()
        {
            return _state;
        }
    }

Объект смотрителя управляет сувенирами для формы.

 public class Caretaker
    {
        private Dictionary<int,IMemento> _mementos = new Dictionary<int,IMemento>();
        public void AddMemento(int tag, IMemento memento)
        {
            _mementos.Add(tag, memento);
        }

        public IMemento GetMemento(int tag)
        {

            if (_mementos.ContainsKey(tag))
            {
                return _mementos[tag];
            }

            return null;
        }
    }

Форма сохраняет новый сувенир Хранителю после изменения состояния. Мы пользуемся преимуществами исключительной гибкости класса объектов ...

private void SaveMemento()
{
            Memento memento = new Memento();
            string[] state = {TextBox1.Text, TextBox2.Text};//expand as needed
            memento.SetState(state);
            _caretaker.AddMemento(_currentStateIndex, memento);
            _currentStateIndex++;
}

Форма восстанавливается по мере необходимости.

private void RevertToPreviousState()
        {
            Memento memento = (Memento)_caretaker.GetMemento(--_currentStateIndex);
            string[] state = (string[]) memento.GetState();
            TextBox1.Text = state[0];
            TextBox2.Text = state[1];//expand as needed

        }

Forgot IMemento - просто интерфейс тегов, если вы хотите поместить смотрителя в другую сборку для полной реализации шаблона Memento.

public interface IMemento
    {
    }
0 голосов
/ 18 августа 2011

доступ к элементам управления для отслеживания состояния не самый лучший способ, но если это то, что вы хотите, я бы посоветовал вам получить доступ к элементам управления, которые являются частными через отражение http://social.msdn.microsoft.com/forums/en-US/clr/thread/ef7cc349-cf35-4b01-95b3-b71675f9b9d5/

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