代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

WinForms数据绑定是否适用于编程更改的属性?

  •  2
  • Joan Venge  · 技术社区  · 15 年前

    我有一些使用数据绑定的UI控件。Add方法,如果我手动更改指定的UI属性,或者在外部更改源对象,它将起作用。

    但是,如果我在代码中调用ui.property=value,那么它既不会更改ui,也不会更改为databindings.add指定的源对象。

    我做错什么了?我用的不对吗?

    1 回复  |  直到 15 年前
        1
  •  8
  •   Nicholas Piasecki    15 年前

    除非对象实现,否则控件不会知道任何内容已更改 INotifyPropertyChanged .然后,对象中的属性setter更改为引发 PropertyChanged 事件,传入事件参数中更改的属性的名称。

    InotifyProperty已更改 是WinForms中的数据绑定机制在连接数据绑定时查找的特定接口。如果它看到一个实现该接口的对象,它将订阅其事件,并且您将看到您的UI自动刷新,而不必告诉数据绑定重新读取它们的值(如果重新分配 DataSource 等)。

    不明显,但当你思考的时候它是有意义的。如果不广播事件,UI控件如何知道属性已更改?它不是每隔一段时间就对房产进行投票。必须被告知财产发生了变化, 属性更改 事件是实现这一目标的常规方式。

    类似(未编译的代码)

    
    public class MyInterestingObject : INotifyPropertyChanged
    {
        private int myInterestingInt;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public int MyInterestingInt
        {
           get { return this.myInterestingInt; }
           set
           {
               if (value != this.myInterestingInt)
               {
                   this.myInterestingInt = value;
                   this.RaisePropertyChanged("MyInterestingInt");
               }
           }
        }
    
        private void RaisePropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                 handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    现在任何有数据绑定到该对象的 MyInterestingInt 属性更改后将自动更新。(有些人喜欢使用代理来实现这个接口。)

    警告:在提升 属性更改 活动!这很容易做到,而且会让你抓耳挠腮,不知道为什么价值没有被更新。