*Когда* вы сохраняете данные из элемента управления редактирования в представлении списка Xamarin Forms?

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

Версия TLDR:

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

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

Вот чуть более подробная версия:

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

Однако для этого приложения вместо того, чтобы вводить информацию на экране, пользователь просто вводит числа в список. Подумайте об инвентаризации: у пользователя есть список продуктов и их количества, и они обновляют количество, чтобы оно соответствовало тому, что у него есть. Пользователь не будет часто покидать экран ввода данных и, скорее всего, выключит устройство или выкинет приложение из памяти, не «возвращаясь назад», поэтому в моих моделях данных могут быть несохраненные данные.

У меня есть поля ввода в списке. Мне нужно отправить введенные данные в мою таблицу sqlite, а затем на наш проприетарный сервер данных. Я бы подумал сделать это из установщика свойств в моей модели данных, но, к сожалению, это вызывается, когда модель данных изначально привязана, И при каждом нажатии клавиши.

Я знаю, что есть много людей, которые закодировали ввод данных в виде списка, я прочитал все сообщения, чтобы понять, как работают ячейки просмотра. В основном я использую элементы управления Entry и пробовал использовать TextChanged, Completed и Unfocused. У каждого есть какая-то проблема, которая делает его нежелательным решением «из коробки». У меня есть некоторые идеи и я знаю, как частично решить мою проблему, но я надеюсь, что у кого-то есть решение намного лучше, чем моя коллекция маленьких лайфхаков.

Очевидно, есть масса деталей (и сложности), которые я упускаю. Я использую архитектуру view-viewmodel-model, но не использую MVVM или любую подобную структуру. Мое решение должно быть в «ванильных» формах Xamarin.

Большое вам спасибо за вашу помощь!


person Karen Cate    schedule 21.06.2019    source источник


Ответы (1)


Я бы прокомментировал, но у меня недостаточно репутации, так что вот оно.

Есть ли конкретная причина, по которой нельзя добавить кнопку на страницу (ниже списка), чтобы пользователь мог нажать ее, когда они закончат «инвентаризацию»? Я предполагаю, что это часть сложности/деталей, которые вы упускаете.

Без кнопки вы могли бы сохранить/отправить данные, используя событие Unfocused в каждом поле ввода. Если пользователь заполнит значение для каждого элемента управления вводом, событие расфокусировки может вызвать метод для сохранения данных. Код программной части станет немного загроможденным, и он может быть беспорядочным, если у вас длинный список элементов управления входом, но он будет выполнять свою работу, пока вы не найдете (или не создадите) или лучший способ.

Надеюсь это поможет.

person Eric B    schedule 21.06.2019
comment
Спасибо, @Eric B. Наши пользователи не нажмут дополнительную кнопку, если я их не заставлю (это не будет естественным образом использовать их устройство), поэтому я пытаюсь понять, как использовать acr.userdialog предложит ввести номер, тогда я узнаю, когда они закончат ввод. Расфокусированным не всегда называют. TextChanged также не всегда вызывается. Поэтому я задался вопросом, должен ли я использовать совершенно другой подход. В этой разновидности объектно-ориентированного программирования очень много такого, чего я не знаю, поэтому я подумал, что стоит посмотреть, есть ли лучший подход. - person Karen Cate; 22.06.2019
comment
Почему бы не использовать DisplayAlert вместо использования acr.userdialog? Я знаю, что вы упомянули, что хотели бы попытаться оставаться как можно ближе к ванильным Xamarin.Forms, чтобы вы могли запрашивать у пользователя без дополнительного пакета NuGet. Возможно, он появится после ввода нескольких значений, а не для каждого. - person Eric B; 22.06.2019
comment
Поскольку DisplayAlerts не предоставляют возможности ввода числового значения. Подумайте об инвентаризации... Ввод большого количества чисел. - person Karen Cate; 24.06.2019
comment
Ах, ты прав. Прошу прощения, это была оплошность с моей стороны. Я думаю, что на данный момент, если вы хотите удовлетворить свои требования и приблизиться к ванильному Xamarin, решение, предоставленное TheMaegges в этом сообщении на форуме, может привести к тому, чего вы хотите: forums.xamarin.com/discussion/35838/ Сочетание этой реализации очень настраиваемого диалогового окна поле с переключателем, с которым пользователь может взаимодействовать, чтобы сигнализировать о том, что он закончил ввод инвентарных номеров, может сработать. - person Eric B; 25.06.2019
comment
Спасибо за ссылку, такой еще не нашел. Мне придется взвесить, хочу ли я попытаться заставить это работать в моем приложении или использовать пакет NuGet Rg.Plugins.Popup. Я действительно надеялся, что есть более элегантное и простое решение. - person Karen Cate; 26.06.2019
comment
Удачи. Если разберетесь, не забудьте обновить свой пост! Извините, я не мог дать окончательный ответ: P - person Eric B; 26.06.2019