动态绑定DataRepeater(Microsoft.VisualBasic.PowerPacks)

时间:2009-10-09 21:16:44

标签: data-binding winforms datarepeater powerpacks

我正在使用DataRepeater来显示屏幕上业务对象的数据。我在C#中使用Windows窗体来完成此任务。数据源在编译时不可用,因此我想在运行时绑定数据源。

以下是简化方案。我正在使用这个商务舱:

public class Product
{

    private double _price;
    public double Price 
    { 
        get
        {
            return _price;
        }
        set
        {
            _price = value;
        }
    }
}

我使用VisualStudio界面创建了一个ProductDataSource,并将价格绑定到标签上。现在我用代码填充了我的转发器的数据源:

dataRepeater1.DataSource = _productDataAgent.GetProducts();

当我启动我的应用程序时,价格正确填写在标签中。到现在为止还挺好。

现在我希望在更新产品时更新价格标签。 Visual Studio界面帮助我,让我选择“数据源更新模式”。所以我选择“OnPropertyChanged”。

这是棘手的部分。 .NET运行时如何知道price属性是从后端更新的。所以我修改我的业务类来实现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,因此没有人在监听。

深入研究问题我在MSDN上的System.Windows.Forms.Binding构造函数页面上找到了以下内容:

  

名为PropertyNameChanged的事件。

所以我尝试使用(自定义)PriceChanged事件,但这不起作用。

我在这里做错了吗?我正在使用WPF,所以也许这在Windows窗体中有点不同?这是因为我在运行时绑定了吗?

1 个答案:

答案 0 :(得分:0)

杰普找到了溶剂。显然你不能简单地绑定到产品列表。您最初会看到产品,但在更改属性时不会更新它们。相反,您需要静态绑定到 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时不需要的一个步骤。