其實我正在使用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();
}
}
}
}
正如你可以看到這個類有一個構造函數這需要控制和屬性名到你喜歡這個對象綁定。對於序列化,我將Control和PropertyName保存爲一個字符串(保存整個控件會稍微多一些;-))。
我添加了一個函數,它將在反序列化之後被調用。但是,正如你所看到的那樣存在那個不存在的功能FindControlByName()
。
現在我可以開始使用Reflection來找到合適的控件,但是對於反射,我需要某種起始點(我會說表單),但是如何在不知道任何其他內容的情況下訪問它?
或者這只是錯誤的做法,我需要一個不同的設計?
任何幫助將感激, 奧利弗