实际上我正在使用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找到合适的控件了,但是对于反射我需要某种起点(我会说表格),但是如何在不知道任何其他内容的情况下访问它?
或者这只是错误的做法,我需要一个不同的设计?
任何帮助都会受到赞赏, 奥利弗
答案 0 :(得分:1)
我同意上一篇文章,从您的数据中删除您的处理。更清洁,更容易调试,维护和扩展。
答案 1 :(得分:0)
就个人而言,我怀疑这是否会“干净” - 序列化对数据很有效,但对于与序列化图之外的对象紧密相连的对象则不太好。
在反序列化时,对象在以太中(事实上,DataContractSerializer
甚至不使用任何构造函数)。因此,它无法进入某个表单等。你可能或许使用静态字段(可能是[ThreadStatic])做一些可怕的黑客来保存当前的表单,但它会很脆弱而且丑陋。
(我希望有人会有更好的答案!)