На самом деле я работаю с C # и уже получил DataBinding и Serialization для работы. Но теперь я хотел бы объединить оба метода в одном классе, и у меня есть небольшая проблема с ним.
Итак, давайте начнем с небольшого примера класса:
using System;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace MySample
{
[DataContract(IsReference = true)]
class SerializeAndBind : IExtensibleDataObject
{
[DataMember]
private String bindedControlName;
[DataMember]
private String bindedPropertyName;
private DateTime creationTime;
[System.ComponentModel.Browsable(false)]
public virtual ExtensionDataObject ExtensionData { get; set; }
public event EventHandler CreationTimeChanged;
public SerializeAndBind()
{
CreationTime = DateTime.Now;
}
public SerializeAndBind(Control ControlName, String PropertyName)
: this()
{
InitializeDataBinding(ControlName, PropertyName);
}
[DataMember]
public DateTime CreationTime
{
get
{
return creationTime;
}
set
{
creationTime = value;
if (CreationTimeChanged != null)
CreationTimeChanged(this, EventArgs.Empty);
}
}
public override string ToString()
{
return CreationTime.ToString();
}
[OnDeserialized]
private void InitializeDataBindingAfterDeserialization(StreamingContext ctx)
{
if (bindedControlName != null)
{
Control control;
control = FindControlByName(bindedControlName);
if(control != null)
InitializeDataBinding(control, bindedPropertyName);
}
}
private void InitializeDataBinding(Control ControlName, string PropertyName)
{
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = this;
Binding binding = new Binding(PropertyName, bindingSource, "CreationTime", true, DataSourceUpdateMode.OnPropertyChanged);
binding.Format += new ConvertEventHandler(OnFormat);
ControlName.DataBindings.Add(binding);
bindedControlName = ControlName.Name;
bindedPropertyName = PropertyName;
}
private void OnFormat(object sender, ConvertEventArgs e)
{
if (e.DesiredType == typeof(String))
{
e.Value = this.ToString();
}
}
}
}
Как видите, у этого класса есть ctor, который принимает Control и PropertyName, к которым вы хотите привязать этот объект. Для сериализации я сохраняю Control и PropertyName в виде строки (сохранение всего элемента управления будет немного большим; -)).
И я добавил функцию, которая будет вызываться после десериализации. Но, как вы можете видеть, существует функция FindControlByName()
, которая не существует.
Теперь я мог бы начать использовать Reflection, чтобы найти подходящий элемент управления, но для отражения мне нужна какая-то отправная точка (я бы сказал, форма), но как класс может получить к ней доступ, не зная ничего вне себя?
Или это просто неправильный способ сделать это, и мне нужен другой дизайн?
Любая помощь будет признательна,
Оливер