С Связывание данных и типы Nullable в WinForms.NET
Сценарий
- У вас есть тип сущности со свойством Nullable.
- У вас есть TextBox, который связан с этим свойством.
- Когда пользователь очищает текст в TextBox, вы хотите, чтобы значение вашего свойства было установлено равным нулю.
Задача
Результат привязки данных просто не будет успешным при очистке TextBox, который связан с типом Nullable.
Решение
В этой статье я собираюсь показать, как вы можете сделать это с помощью Extender Provider.
Просто добавьте класс Component в ваш проект, который также реализует интерфейс IExtenderProvider
[ProvideProperty("NullableBinding", typeof(TextBox))]
public partial class NullableExtender : Component, IExtenderProvider
Атрибут ProviderProperty указывает, что при добавлении компонента NullableExtender в вашу форму или UserControl все текстовые поля будут иметь дополнительное свойство с именем NullableBinding. В конструкторе VS.NET это будет выглядеть примерно так:
Теперь, чтобы реализовать некоторые функции для этого свойства:
private Dictionary<Control, Boolean> _nullables = new Dictionary<Control,bool>();
/// <summary>
/// This is the get part of the extender property.
/// It is actually a method because it takes the control.
/// </summary>
/// <param name="control"></param>
[DefaultValue(false),
Category("Data")]
public bool GetNullableBinding(Control control)
{
bool nullableBinding = false;
_nullables.TryGetValue(control, out nullableBinding);
return nullableBinding;
}
/// <summary>
/// This is the set part of the extender property.
/// It is actually a method because it takes the control.
/// </summary>
/// <param name="control"></param>
/// <param name="nullable"></param>
public void SetNullableBinding(Control control, bool nullable)
{
if (_nullables.ContainsKey(control))
_nullables[control] = nullable;
else
_nullables.Add(control, nullable);
if (nullable)
{
// Add a parse event handler.
control.DataBindings["Text"].Parse += new ConvertEventHandler(NullableExtender_Parse);
}
}
/// <summary>
/// When parsing, set the value to null if the value is empty.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NullableExtender_Parse(object sender, ConvertEventArgs e)
{
if (e.Value.ToString().Length == 0)
{
e.Value = null;
}
}
Код, который на самом деле выполняет вышеприведенный трюк, добавляет обработчик события для события Parse привязки данных. Обработчик событий просто устанавливает значение null, если значение представляет собой пустую строку, и привязка данных завершается успешно.
Значение свойства по умолчанию установлено в false, так как большинство свойств не имеют типа Nullable, и я бы предложил не устанавливать для NullableBinding значение true для этих свойств ...;)