Binding property to control in Winforms

前端 未结 2 955
北海茫月
北海茫月 2020-11-28 05:15

What is the best way to bind a property to a control so that when the property value is changed, the control\'s bound property changes with it.

So if I have a proper

相关标签:
2条回答
  • 2020-11-28 05:51

    A simplified version of the accepted answer that does NOT require you to type names of properties manually in every property setter like OnPropertyChanged("some-property-name"). Instead you just call OnPropertyChanged() without parameters:

    You need .NET 4.5 minimum. CallerMemberName is in the System.Runtime.CompilerServices namespace

    public class Sample : INotifyPropertyChanged
    {
        private string _propString;
        private int _propInt;
    
    
        //======================================
        // Actual implementation
        //======================================
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
        //======================================
        // END: actual implementation
        //======================================
    
    
        public string PropString
        {
            get { return _propString; }
            set
            {
                // do not trigger change event if values are the same
                if (Equals(value, _propString)) return;
                _propString = value;
    
                //===================
                // Usage in the Source
                //===================
                OnPropertyChanged();
    
            }
        }
    
        public int PropInt
        {
            get { return _propInt; }
            set
            {
                // do not allow negative numbers, but always trigger a change event
                _propInt = value < 0 ? 0 : value;
                OnPropertyChanged();
            }
        }
    }
    

    Usage stays the same:

    var source = new Sample();
    textbox.DataBindings.Add("Text", source, "PropString");
    source.PropString = "Some new string";
    

    Hope this helps someone.

    0 讨论(0)
  • 2020-11-28 05:54

    You must implement INotifyPropertyChanged And add binding to textbox.

    I will provide C# code snippet. Hope it helps

    class Sample : INotifyPropertyChanged
    {
        private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set
            {
                firstName = value;
                InvokePropertyChanged(new PropertyChangedEventArgs("FirstName"));
            }
        }
    
        #region Implementation of INotifyPropertyChanged
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void InvokePropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, e);
        }
    
        #endregion
    }
    

    Usage :

     Sample sourceObject = new Sample();
     textbox.DataBindings.Add("Text",sourceObject,"FirstName");
     sourceObject.FirstName = "Stack"; 
    
    0 讨论(0)
提交回复
热议问题