Десериализация в пользовательский интерфейс

У меня есть сборка, содержащая несколько объектов UserControl , которые я хочу иметь возможность сохранять / загружать через пользовательский интерфейс приложения. Для этого каждый элемент управления реализует ISerializable inter лицом, чтобы настроить поля, которые они должны сохранить.

Вот упрощенная версия этой библиотеки:

namespace LibraryProject
{
    using System;
    using System.Runtime.Serialization;
    using System.Windows.Forms;

    [Serializable]
    public partial class UserControl1 : UserControl, ISerializable
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public UserControl1(SerializationInfo info, StreamingContext ctxt)
            : this()
        {
            this.checkBox1.Checked = info.GetBoolean("Checked");
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Checked", this.checkBox1.Checked);
        }
    }
}

Клиентское приложение создает экземпляры нескольких из этих элементов управления и позволяет пользователю сохранять / загружать различные конфигурации UserControl . Вот упрощенная версия приложения:

namespace ApplicationProject
{
    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Soap;
    using System.Windows.Forms;
    using LibraryProject;

    public partial class Form1 : Form
    {
        private const string filename = @"test.xml";

        //int hash1;
        //int hash2;

        public Form1()
        {
            InitializeComponent();

            //hash1 = this.ctrl1.GetHashCode();
        }

        private void SaveClick(object sender, EventArgs e)
        {
            using (var stream = File.Open(filename, FileMode.Create))
            {
                var formatter = new SoapFormatter();

                formatter.Serialize(stream, this.ctrl1);
            }
        }

        private void LoadClick(object sender, EventArgs e)
        {
            using (var stream = File.Open(filename, FileMode.Open))
            {
                var formatter = new SoapFormatter();

                this.ctrl1= (UserControl1)formatter.Deserialize(stream);
            }

            //hash2 = this.ctrl1.GetHashCode();
        }
    }
}

На SaveClick значения правильно сохраняются в файл. На LoadClick CheckBox.Checked правильно обновляется в списке наблюдения отладчика, но пользовательский интерфейс не отражает новое значение.

Я попытался добавить вызовы к ] Refresh () , Invalidate () , Update () , но ничего не работает.

Как и ожидалось, hash1 и ] hash2 отличаются, но Form1 использует правильный экземпляр.

Что я делаю не так и как мне исправить пользовательский интерфейс, чтобы отображалось правильное (обновленное) значение?

РЕДАКТИРОВАТЬ: Также обратите внимание, что мне нужно обрабатывать несколько файлов конфигурации, и пользователь должен иметь возможность сохранить / загрузить в / из пути по ее выбору

6
задан Gustavo Mori 3 July 2011 в 02:50
поделиться