Каков наилучший способ передачи данных между основным блоком (или основным диалоговым окном) и модальным диалоговым окном?
Мне нужен модальный диалог, чтобы собрать некоторый пользовательский ввод. Затем мне нужно, чтобы те же данные использовались приложением MainFrame.
Обычно мой модальный диалог имеет указатель на какой-нибудь DataType, способный хранить то, что мне нужно, и я передаю этот объект по ссылке из MainFrame, чтобы иметь возможность восстановить данные после закрытия модального диалога пользователем.
Это лучший способ передачи данных?
Это не правильно!
4 ответа
Поскольку вы передаете данные после того, как пользователь закрыл диалоговое окно (предположительно в DialogResult.OK), вы можете легко сделать это без ссылки на MainFrame.
Допустим, в вашем диалоге есть TextBox, называемый userNameTextBox, и кнопка, которая завершает диалог с результатом OK. Вы можете сделать userNameTextBox общедоступным (не рекомендуется) или добавить свойство для возврата текста.
public string UserName
{
get { return userNameTextBox.Text; }
}
И чтобы получить это значение после окончания диалога, вы просто делаете:
Dialog dialog = new Dialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
string username = dialog.UserName;
}
Предложение @ Самуэля совершенно адекватно при сборе одного или двух значений от пользователя.
Если вы получаете много значений, то решение в вашем вопросе тоже подойдет.
Не становитесь жертвой преждевременной оптимизации и чрезмерно разрабатывайте несвязанное решение. По граничному объекту я предполагаю, что вы ссылаетесь на экземпляр структуры данных, на который ссылаются мэйнфрейм и диалог. В чем проблема с диалогом и мэйнфреймом, которые ссылаются на этот объект? В чем выгода разъединения объекта границы / переноса в этом сценарии?
Единственная отдача, которую я мог видеть здесь, была бы отделением мэйнфрейма от конкретной реализации, которая доставляет ему данные. Таким образом, вместо того, чтобы создавать экземпляр Dialog и вызывать Dialog. ShowModal для мэйнфрейма, внедрение зависимостей предоставит мэйнфрейму IDataYouNeedGetter (который может оказаться тем же самым модальным диалогом), и в соответствующее время мэйнфрейм будет делать
myGetter.SetTransferObject(dataStructInstance)
myGetter.GoGetTheData()
// do stuff with dataStructInstance now that myGetter set it up.
НО, нет причин добавлять слой косвенности, если вы уже не знаете о конкретной необходимости разъединения.
Самый лучший способ сделать это - упаковать данные в событие и отправить их на шину событий.
Это отделяет диалог от мэйнфрейма - и если вы правильно спроектируете событие, это не ограничивает вас просто использованием диалога.
В зависимости от языка и среды эта система событий может быть реализована легко и дешево. Я называю свою версию класса на основе межобъектного общения.
Обычно вы можете использовать один класс или другой тип данных для передачи данных. Таким образом, диалог используется для изменения свойств класса. Почему это не так?
[юмор] С мэйнфреймом я предполагаю, что вы не имеете в виду большие старые (хоть и живые и здоровые) компьютеры. Иначе я думаю, что TCP/IP будет хорошим выбором. [/юмор]