代码之家  ›  专栏  ›  技术社区  ›  nicojs

动态绑定数据转发器(microsoft.visualbasic.powerpacks)

  •  0
  • nicojs  · 技术社区  · 16 年前

    我使用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事件为空,因此没有人在监听。

    深入研究这个问题,我在msdn的system.windows.forms.binding constructor页面上发现了以下内容:

    名为PropertyNameChanged的事件。

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

    我在这里做错什么了吗?我不打算使用wpf,所以这在windows窗体中可能有点不同?这是因为我在运行时绑定吗?

    1 回复  |  直到 16 年前
        1
  •  0
  •   nicojs    16 年前

    杰普找到了解决办法。显然你不能简单地绑定到一个产品列表。最初您将看到这些产品,但在更改属性时不会更新它们。相反,您需要静态绑定到 绑定源 . 只需使用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时不需要的一个步骤。

    推荐文章