Привязка к управляющему свойству Nullable <DateTime> - PullRequest
8 голосов
/ 29 октября 2009

У нас есть пользовательский элемент управления, который имеет свойство «Значение» типа System.Nullable (иначе System.DateTime?). У нас есть объект со свойством «Received» того же типа. Когда мы пытаемся привязать элемент управления к объекту, выдается следующее InvalidCastException :

Неверное приведение из 'System.DateTime' к 'System.Nullable`1 [[System.DateTime, mscorlib, Версия = 2.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089]]'.

Вот что мы делаем:

Свойство объекта:

private System.DateTime? _dateTimeReceived;
public System.DateTime? DateTimeReceived
{
    get
    {
        return this._dateTimeReceived;
    }
    set
    {
        this._dateTimeReceived = value;
        this.OnChanged("DateTimeReceived", value); //Implements INotifyPropertyChanged and fires PropertyChanged event
    }
}

Управляющее свойство:

private System.DateTime? _value;
[System.ComponentModel.Category("Behavior")]
[System.ComponentModel.Description("The current date value for this control")]
public new System.DateTime? Value
{
    get
    {
        return this._value;
    }

    set
    {
        this._value = value;
    }
}

В приложении выдается исключение:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived");

Как видите, свойство объекта (this._object.DateTimeReceived) является System.DateTime? Тип и свойство элемента управления (this.dateReceived.Value) является System.DateTime? типа.

Почему это может вызвать InvalidCastException ? И как мы можем исправить это так, чтобы оно правильно связывалось?

Обновление 2009-10-29 14:26 CDT:

Вот трассировка стека:

в System.Convert.DefaultToType (IConvertible значение, тип targetType, Провайдер IFormatProvider)
в System.DateTime.System.IConvertible.ToType (Тип тип, IFormatProvider провайдер)
в System.Convert.ChangeType (значение объекта, тип ConversionType, провайдер IFormatProvider)
в System.Windows.Forms.Binding.FormatObject (значение объекта)
в System.Windows.Forms.Binding.PushData (логическая сила)
в System.Windows.Forms.Binding.UpdateIsBinding ()
в System.Windows.Forms.Binding.CheckBinding ()
в System.Windows.Forms.Binding.SetListManager (BindingManagerBase bindingManagerBase)
в System.Windows.Forms.ListManagerBindingsCollection.AddCore (Binding привязка данных)
в System.Windows.Forms.BindingsCollection.Add (привязка привязки)
в System.Windows.Forms.BindingContext.UpdateBinding (BindingContext newBindingContext, Bindinginding)
в System.Windows.Forms.Binding.SetBindableComponent (IBindableComponent значение)
при System.Windows.Forms.ControlBindingsCollection.AddCore (Binding привязка данных)
при System.Windows.Forms.BindingsCollection.Add (привязка привязки)
в System.Windows.Forms.ControlBindingsCollection.Add (String propertyName, объект dataSource, строка dataMember, логическое значение formattingEnabled, DataSourceUpdateMode updateMode, Object nullValue, String formatString, IFormatProvider formatInfo)
в System.Windows.Forms.ControlBindingsCollection.Add (String propertyName, ObjectSource, String dataMember)

1 Ответ

13 голосов
/ 09 ноября 2009

Я пытался сделать то же самое, и мне удалось найти какой-то рабочий пример кода, который связан с обнуляемым значением. Оказывается, если вы установили для formattingEnabled значение true, оно работает, но если оно равно false, вы получите недопустимое исключение приведения.

Итак, ваш код выглядит так:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived");

Вместо этого должно выглядеть так:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived", true);

Очевидно, старый код привязки данных требует, чтобы типы точно совпадали, но позже Microsoft добавила возможность автоматического преобразования типов для вас. Отсюда: http://msdn.microsoft.com/en-us/library/aa480734.aspx

В более ранних версиях .NET Framework вам приходилось вручную выполнять преобразование типов и форматирование с использованием событий Format и Parse объекта Binding. Теперь вы можете сделать это, включив форматирование объекта Binding, либо установив свойство FormattingEnabled напрямую, либо передав true в метод Add элемента ControlBindingsCollection.

...