Кажется, что при использовании элемента управления Entry
в формах Xamarin, если его не трогать, он возвращает Null
. Однако, если пользователь вводит что-либо, а затем очищает элемент управления, он возвращает string.Empty
В идеале я хочу просто сохранить значение Null
, поскольку они попадают в базу данных, и, как вы можете себе представить, это не очень совместимо с Null
s и пустыми строками.
Как лучше всего достичь цели сохранения Null
независимо от того, был ли элемент управления отредактирован?
Я рассматривал конвертеры, но это означает добавление их ко всем элементам управления Entry
, возможно, что-то делать на уровне доступа к данным ... не знаю, что, поскольку это не будет означать дополнительный код для всех свойств.
Я думал об этом, но подумал, что преобразование string.Empty в Null излишне.
Вы можете использовать поведение.
Код
public class EntryNullBehavior : Behavior<Entry>
{
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
if (sender is Entry entry)
{
if (args.NewTextValue != null && args.NewTextValue.Equals(string.Empty))
{
entry.Text = null;
}
}
}
}
Usgae в Xaml
xmlns:behavior = "clr-namespace:DummyTestApp.Behavior"
...
<Entry x:Name = "MyNullEntry" HeightRequest = "50" FontSize = "Large">
<Entry.Behaviors>
<behavior:EntryNullBehavior/>
</Entry.Behaviors>
</Entry>
P.S. Теперь я не знаю, что вы считаете излишним (видя ваш комментарий), но это решение элегантно.
Спасибо за это. Так как это будет широко использоваться в большом проекте, его должно быть легко интегрировать, не добавляя тонны наворотов в код XAML. Теперь я подумал об использовании конвертера и фактически начал его реализовывать, а затем столкнулся с проблемой, некоторые элементы управления вводом уже использовали конвертер. Так что, учитывая факты, я думаю (до сих пор), что путь вперед кажется поведением.
На самом деле я создал очень простой настраиваемый элемент управления, поскольку, поскольку мне требовалась эта функция для всех элементов управления Entry, не имело смысла добавлять Behaviors к каждому из них.
public class EntryEx : Entry
{
protected override void OnTextChanged(string oldValue, string newValue)
{
base.OnTextChanged(oldValue, newValue == string.Empty ? null : newValue);
}
}
Спасибо Джейсону за идею.
это лучше, но вы сказали, что настраиваемый элемент управления излишен, поэтому мне пришлось написать поведение
на первый взгляд казалось, что да, но затем, реализовав поведение, я вскоре понял, что на самом деле это больше работы, и создал больше кода XAML. Это недостаток того, что я был разработчиком-одиночкой, мне не от кого отталкиваться идеями :(
почему бы не создать собственный элемент управления Entry, обеспечивающий желаемое поведение?