组合序列化和DataBinding的问题

时间:2009-01-21 11:36:04

标签: c# data-binding serialization

实际上我正在使用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找到合适的控件了,但是对于反射我需要某种起点(我会说表格),但是如何在不知道任何其他内容的情况下访问它?

或者这只是错误的做法,我需要一个不同的设计?

任何帮助都会受到赞赏, 奥利弗

2 个答案:

答案 0 :(得分:1)

我同意上一篇文章,从您的数据中删除您的处理。更清洁,更容易调试,维护和扩展。

答案 1 :(得分:0)

就个人而言,我怀疑这是否会“干净” - 序列化对数据很有效,但对于与序列化图之外的对象紧密相连的对象则不太好。

在反序列化时,对象在以太中(事实上,DataContractSerializer甚至不使用任何构造函数)。因此,它无法进入某个表单等。你可能或许使用静态字段(可能是[ThreadStatic])做一些可怕的黑客来保存当前的表单,但它会很脆弱而且丑陋。

(我希望有人会有更好的答案!)