Привязка Winform к словарю или списку ключей / значений - PullRequest
1 голос
/ 23 марта 2012

У меня есть приложение Winforms, которое динамически создает экземпляры внешних объектов формы для использования в пользовательском интерфейсе конфигурации.Каждая динамически создаваемая форма помещается в TabPage.

Я хотел бы создать свойство, которое будет принимать список словаря или ключа / значения, и заполнять форму этими значениями, сопоставляя значение элемента управлениясо значением ключа в словаре.И наоборот, свойство также будет возвращать список ключей / значений, который соответствует значениям элементов управления в Winform.

Это простая проблема привязки, или мне нужно написать собственный код?Как бы выглядел этот код?

В прошлом я достиг этого, написав класс DTO , используя сериализацию и десериализацию XML для сохранения данных класса и подключения полей формы.в поля объекта DTO.Проблема в том, что поскольку форма динамически создается из внешней библиотеки DLL, нет никакого способа «ссылаться» на этот класс DTO статически, поэтому я ищу более динамичный подход.

1 Ответ

1 голос
/ 23 марта 2012

Оказалось проще, чем я думал.

public Dictionary<string, string> Values
{
    get
    {
        var values = new Dictionary<string, string>();
        foreach (var control in Controls)
        {
            switch(control.GetType().Name) 
            {
                case "TextBox" : 
                    var textBox = (TextBox)control;
                    values.Add(textBox.Name, textBox.Text);
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    values.Add(comboBox.Name, comboBox.SelectedItem.ToString());
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    values.Add(checkBox.Name, checkBox.Checked.ToString());
                    break;

                // TODO: Add additional cases to support other control types
            }
        }
        return values;
    }
    set
    {
        foreach (var control in Controls)
        {
            switch (control.GetType().Name)
            {
                case "TextBox":
                    var textBox = (TextBox)control;
                    textBox.Text = value[textBox.Name];
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    comboBox.SelectedItem = value[comboBox.Name];
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    checkBox.Checked = bool.Parse(value[checkBox.Name]);
                    break;

                // TODO: Add additional cases to support other control types
            }
        }
    }
...