winform控件的DataBinding似乎只能更新一次控件,那就不能算是DataBinding啊

qweroio 2014-08-04 08:35:24
例如我的Form1有一个String类型的属性S,有一个textBox和一个按钮button1,我在Form1_Load里面去做数据绑定:


public string _s = "xyz";

public string S
{
get { return _s; }
set { _s = value; }
}

private void button1_Click(object sender, EventArgs e)
{
this._s = "kkk";
}

private void Form1_Load(object sender, EventArgs e)
{
this.textBox1.DataBindings.Add("Text", this, "S", false, DataSourceUpdateMode.OnPropertyChanged);
}

如题,form加载的时候textBox里面确实显示了"abc"。但是我单击按钮button1,虽然this._s="kkk"执行了,但是显然没有起到更新界面的效果。

网上说,要实现真正的DataBinding,就要实现INotifyPropertyChanged接口。但是我看这个东西基本是给WPF用的。
那么,这个看来,winform控件的DataBinding只是一锤子买卖,并不能实现真正的属性和控件的绑定? 是这样的吗?
...全文
612 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qweroio 2014-08-05
  • 打赏
  • 举报
回复
引用 1 楼 gomoku 的回复:
INotifyPropertyChanged从Dotnet2就存在了,也一向用在数据绑定上。你的情况数据源是要实现该接口。

    public partial class Form1 : Form, INotifyPropertyChanged  //<--实现INotifyPropertyChanged  
    {
        public string _s = "xyz";
        public string S
        {
            get { return _s; }
            set { if (_s != value) { _s = value; FirePropertyChanged("S"); } } //<--通知属性更改,相关控件可以更新显示
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        void FirePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null) propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
知道了,而且修改值的时候要操作属性S,而不是私有成员_s 在set里面去触发EventHandler通知所有的观察者。这些观察者在DataBinding.Add的时候自动会注册到实现了INotifyPropertyChanged接口的对象上面。 现在很清楚了。多谢!
gomoku 2014-08-05
  • 打赏
  • 举报
回复
INotifyPropertyChanged从Dotnet2就存在了,也一向用在数据绑定上。你的情况数据源是要实现该接口。

    public partial class Form1 : Form, INotifyPropertyChanged  //<--实现INotifyPropertyChanged  
    {
        public string _s = "xyz";
        public string S
        {
            get { return _s; }
            set { if (_s != value) { _s = value; FirePropertyChanged("S"); } } //<--通知属性更改,相关控件可以更新显示
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        void FirePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null) propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
埋头苦练 2014-08-05
  • 打赏
  • 举报
回复
引用 2 楼 qweroio 的回复:
[quote=引用 1 楼 gomoku 的回复:] INotifyPropertyChanged从Dotnet2就存在了,也一向用在数据绑定上。你的情况数据源是要实现该接口。

    public partial class Form1 : Form, INotifyPropertyChanged  //<--实现INotifyPropertyChanged  
    {
        public string _s = "xyz";
        public string S
        {
            get { return _s; }
            set { if (_s != value) { _s = value; FirePropertyChanged("S"); } } //<--通知属性更改,相关控件可以更新显示
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        void FirePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null) propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
知道了,而且修改值的时候要操作属性S,而不是私有成员_s 在set里面去触发EventHandler通知所有的观察者。这些观察者在DataBinding.Add的时候自动会注册到实现了INotifyPropertyChanged接口的对象上面。 现在很清楚了。多谢![/quote] 学习了

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧