Динамическое связывание DataRepeater (Microsoft.VisualBasic.PowerPacks) - PullRequest
0 голосов
/ 10 октября 2009

Я использую 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? Это потому, что я связываюсь во время выполнения?

1 Ответ

0 голосов
/ 13 октября 2009

Джип нашел решение. По-видимому, вы не можете просто привязать к списку продуктов. Сначала вы увидите продукты, но они не будут обновлены при изменении свойства. Вместо этого вам необходимо статически связываться с BindingSource . Просто создайте объектный источник данных с помощью Visual Studio (в меню данных). Код, подобный этому, генерируется:

private System.Windows.Forms.BindingSource beursProductDisplayBindingSource;
this.beursProductDisplayBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.dataRepeater1.DataSource = this.beursProductDisplayBindingSource;

Теперь вы можете динамически связываться так:

BindingSource productBinding = ((BindingSource)dataRepeater1.DataSource);
_productDataAgent.BeursProducts.ForEach(product => productBinding.Add(product));

Теперь при реализации INotifyPropertyChanged в вашем объекте данных, как я сделал, работает как ожидалось. Просто забыл один шаг, который не нужен при использовании WPF.

...