Я использую DataRepeater для отображения данных бизнес-объектов на экране. Я использую формы Windows в C # для достижения этой цели. Источник данных недоступен во время компиляции, поэтому я хочу связать источник данных во время выполнения.
Вот упрощенный сценарий. Я использую этот бизнес-класс:
public class Product
{
private double _price;
public double Price
{
get
{
return _price;
}
set
{
_price = value;
}
}
}
Я создал ProductDataSource с интерфейсом VisualStudio и привязал цену к метке. Теперь я заполнил источник данных моего ретранслятора в коде:
dataRepeater1.DataSource = _productDataAgent.GetProducts();
Когда я запускаю свое приложение, цены правильно указаны в ярлыках. Все идет нормально.
Теперь я хочу, чтобы ценовые ярлыки обновлялись при обновлении продукта. Интерфейс Visual Studio помогает мне и позволяет мне выбрать «Режим обновления источника данных». Поэтому я выбираю «OnPropertyChanged».
Здесь начинается сложная часть. Как среда выполнения .NET узнает, что свойство цены обновляется из бэкэнда. Поэтому я изменяю свой бизнес-класс для реализации INotifyPropertyChanged. Как это:
public class Product : INotifyPropertyChanged
{
private double _price;
public double Price
{
get
{
return _price;
}
set
{
_price = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Price"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Проблема в том, что это не работает. Когда я обновляю продукт, он не обновляется в интерфейсе. Когда я отлаживаю и изменяю свойство, я вижу, что событие PropertyChanged имеет значение null, поэтому никто не слушает.
Рассматривая проблему немного глубже, я обнаружил следующее на странице конструктора System.Windows.Forms.Binding в MSDN:
Событие с именем PropertyNameChanged.
Поэтому я попытался использовать (пользовательское) событие PriceChanged, но это не сработало.
Я что-то здесь не так делаю? Я использую WPF, так что, может быть, это немного отличается в Windows Forms? Это потому, что я связываюсь во время выполнения?