С# - привязка TextBox к целому числу

Как связать TextBox с целым числом? Например, блок привязки к textBox1.

public partial class Form1 : Form
{
    int unit;

    public Form1()
    {
        InitializeComponent();


    }

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.DataBindings.Add("Text", unit, "???");
    }

Ответы

Ответ 1

Это должно быть публичное свойство экземпляра; в этом случае "this" будет достаточно:

public int Unit {get;set;}
private void Form1_Load(object sender, EventArgs e)
{
    textBox1.DataBindings.Add("Text", this, "Unit");
}

Для двустороннего уведомления вам потребуется либо UnitChanged, либо INotifyPropertyChanged:

private int unit;
public event EventHandler UnitChanged; // or via the "Events" list
public int Unit {
    get {return unit;}
    set {
        if(value!=unit) {
            unit = value;
            EventHandler handler = UnitChanged;
            if(handler!=null) handler(this,EventArgs.Empty);
        }
    }
}

Если вы не хотите его публичного API, вы можете где-то его скрыть:

class UnitWrapper {
    public int Unit {get;set;}
}
private UnitWrapper unit = new UnitWrapper();
private void Form1_Load(object sender, EventArgs e)
{
    textBox1.DataBindings.Add("Text", unit, "Unit");
}

Информация о событиях "информация о событиях" выглядит примерно так:

    private static readonly object UnitChangedKey = new object();
    public event EventHandler UnitChanged
    {
        add {Events.AddHandler(UnitChangedKey, value);}
        remove {Events.AddHandler(UnitChangedKey, value);}
    }
    ...
    EventHandler handler = (EventHandler)Events[UnitChangedKey];
    if (handler != null) handler(this, EventArgs.Empty);

Ответ 2

Вы можете использовать источник привязки (см. комментарий). Самое простое изменение:

public partial class Form1 : Form
{
    public int Unit { get; set; }
    BindingSource form1BindingSource;

    private void Form1_Load (...)
    {
        form1BindingSource.DataSource = this;
        textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit");
    }
}

Тем не менее, вы получите некоторую концептуальную ясность, если немного выделите данные:

public partial class Form1 : Form
{
    class MyData {
        public int Unit { get; set; }
    }

    MyData form1Data;
    BindingSource form1BindingSource;

    private void Form1_Load (...)
    {
        form1BindingSource.DataSource = form1Data;
        textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit");
    }
}

НТН. Модификаторы доступа для заметок не указаны.

Ответ 3

Одна из вещей, которые мне нравится делать, - создать слой "презентация" для формы. Именно в этом слое я объявляю свойства, привязанные к элементам управления формы. В этом случае элемент управления представляет собой текстовое поле.

В этом примере у меня есть форма с текстовым полем для отображения IP-адреса

enter image description here

Теперь мы создаем источник привязки через свойства текстового поля. Выберите DataBindings- > Text. Нажмите стрелку вниз; выберите "Добавить источник данных проекта".

enter image description here

Запустится мастер создания источника данных. Выберите объект. Нажмите "Далее".

enter image description here

Теперь выберите класс, у которого есть свойство, которое будет ограничено текстовым полем. В этом примере я выбрал PNetworkOptions. Выберите "Готово", чтобы завершить работу мастера. Источник BindingSource не будет создан.

enter image description here

Следующий шаг - выбрать фактическое свойство из связанного класса. Из DataBindings- > Text выберите downarrow и выберите имя свойства, которое будет привязано к текстовому поле.

enter image description here

В классе, у которого есть ваше свойство, INotifyPropertyChanged должен быть реализован для двусторонней связи для поля IP-адреса

public class PNetworkOptions : IBaseInterface, INotifyPropertyChanged
{
    private string _IPAddress;


    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public string IPAddress
    {
        get { return _IPAddress; }
        set
        {
            if (value != null && value != _IPAddress)
            {
                _IPAddress = value;
                NotifyPropertyChanged("IPAddress");
            }
        }
    }
}

В конструкторе формы мы должны конкретно определить привязку

Binding IPAddressbinding = mskTxtIPAddress.DataBindings.Add("Text", _NetOptions, "IPAddress",true,DataSourceUpdateMode.OnPropertyChanged);