привязка данных c # к строковому свойству в универсальном
-
03-07-2019 - |
Вопрос
Я пытаюсь привязать данные к моему пользовательскому классу 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;
}
}