代码之家  ›  专栏  ›  技术社区  ›  Ian manuel aldana

将标签绑定到“变量”

  •  21
  • Ian manuel aldana  · 技术社区  · 14 年前

    假设我有一个名为X的全局变量INT。因为X是全局的,所以我们可以假设任何东西都可以修改它的值,所以每次都在改变它。

    假设我有一个名为“Label”的Label控件。以下是我想要完成的:

    现在,我不想用这个编写事件侦听器并处理委托(我想要尽可能少的代码)。有没有一种方法可以使用这个数据绑定组件?或者其他新奇的技术?

    4 回复  |  直到 5 年前
        1
  •  33
  •   Tim Schmelter    11 年前

    如果要使用数据绑定基础结构并反映对值所做的更改,则需要一种方法来通知UI对绑定值所做的更改。

    所以最好的方法是使用一个属性并实现 INotifyPropertyChanged

    class frmFoo : Form, INotifyPropertyChanged
    {        
        private string _foo;
    
        public string Foo
        {
            get { return _foo; }
            set
            {
                _foo = value;
                OnPropertyChanged("Foo");
            }
        }
    
        protected virtual void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    }
    

    还要记住,您需要首先在标签上设置绑定:

    public frmFoo()
    {
        InitializeComponent();
        lblTest.DataBindings.Add(new Binding("Text", this, "Foo"));
    }
    
        2
  •  9
  •   Piotr Dabkowski    6 年前

    对于多线程程序(几乎所有windows窗体程序)来说,iCe的答案都不是一个好的答案,因为它无论如何都不允许您更改标签(您将得到一些跨线程错误)。解决此问题的最简单方法是在setter中创建属性:

    private string _labelText;
    public string labelText
    {
        get { return _labelText; }
        set
        {
            _labelText = value;
            updateLabelText(_labelText); //setting label to value
       }
    }
    

    delegate void updateLabelTextDelegate(string newText);
    private void updateLabelText(string newText)
    {
         if (label1.InvokeRequired)
         {
              // this is worker thread
              updateLabelTextDelegate del = new updateLabelTextDelegate(updateLabelText);
              label1.Invoke(del, new object[] { newText });
         }
         else
         {
              // this is UI thread
              label1.Text = newText;
         }
    }
    
        3
  •  3
  •   Gishu    14 年前

    这就是为什么需要将变量包装到属性中。在setter中引发一个事件来通知绑定到它的UI控件,以便它们可以刷新并显示新值。框架有一个机制来实现这个-INotifyPropertyChanged-try this link for a how-to .

        4
  •  1
  •   Krunal    14 年前

    为X创建属性。在setter中更新label.Text属性。

    private int _x;
    public int X {
        get 
        { 
            return _x; 
        } 
        set 
        { 
            _x = value;
            label.Text = _x.ToString();
        }
    }