привязка данных c # к строковому свойству в универсальном

StackOverflow https://stackoverflow.com/questions/616026

Вопрос

Я пытаюсь привязать данные к моему пользовательскому классу dictionary.В FormLoad я могу привязаться к Car.Desc, но я не могу привязаться к RatesCache.Desc.Они оба являются общедоступными строковыми свойствами.

Что я упускаю из виду?

Спасибо!

System.Исключение ArgumentException не было обработано Message="Не удается выполнить привязку к свойству или столбцу Desc в источнике данных. Pпараметр name:Элемент данных" Источник="Система.Windows.Формы" Имя_параметра="Элемент данных"

    public class RatesCache : Dictionary<int, Rate>
    {
        public string Desc { get; set; }
    }

    public class Car
    {
        public string Desc { get; set; }
    }

    static Car car = new Car();

    static RatesCache rc = new RatesCache();

    private void Form1_Load(object sender, EventArgs e)
    {
        rc.Desc = "hello too";
        car.Desc = "Im a car";
        textBox1.DataBindings.Add("Text", rc, "Desc");
    }
Это было полезно?

Решение

Я предполагаю, что, поскольку ваш класс наследуется от словаря, который является коллекцией, он отключает привязку данных для текстового поля.Windows Forms имеет свой собственный способ работы с привязкой данных к коллекции, отличный от того, который используется при привязке непосредственно к свойству класса.Не самый лучший ответ, я знаю, но я не думаю, что на самом деле есть способ обойти это.Мое предложение состояло бы в том, чтобы либо не наследовать напрямую от Dictionary;скорее сохраняйте внутренний словарь и предоставляйте методы по мере необходимости.Или не привязывайте texbox к данным напрямую.Скорее, вызывайте событие всякий раз, когда ваше свойство "Desc" изменяется в вашем классе RatesCache, а затем в вашей форме прослушивайте это событие.Когда оно изменится, обновите свое текстовое поле.

Другие советы

private void Form1_Load(object sender, EventArgs e)
{
    rc.Desc = "hello too";
    car.Desc = "Im a car";
    textBox1.DataBindings.Add("Text", rc, "Desc");
    textBox1.TextChanged .TextChanged += _textBox1_TextChanged;
}

private void _messagesReceviedLabel_TextChanged(object sender, EventArgs e)
{
    _textBox1.Text = rc.Desc.ToString();
}

public class RatesCache : Dictionary<int, Rate>
{
    public string Desc { get; set; }

    public override string ToString()
    {
        return Desc;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top