Проблемы с объединением сериализации и привязки данных - PullRequest
1 голос
/ 21 января 2009

На самом деле я работаю с 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 ]

1 голос
/ 21 января 2009

Я согласен с предыдущим постом, отделите вашу обработку от ваших данных. Гораздо чище и проще в отладке, обслуживании и масштабировании.

0 голосов
/ 21 января 2009

Лично я сомневаюсь, что это когда-нибудь будет "чисто" - сериализация работает хорошо для данных, но не так хорошо для объектов, тесно связанных с объектами вне графа сериализации.

В момент десериализации объект находится в эфире (фактически DataContractSerializer даже не использует любой конструктор). Таким образом, у него нет возможности добраться до формы и т. Д. Вы могли бы , возможно, сделать несколько ужасных хаков со статическим полем (возможно, [ThreadStatic]), чтобы сохранить текущую форму, но это было бы хрупко и некрасиво.

(Я надеюсь, что кто-то получит лучший ответ!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...