Подтвердить что ты не робот

Привяжите ярлык к переменной "variable"

Скажем, у меня есть глобальная переменная INT с именем X. Поскольку X является глобальной, мы можем предположить, что все может изменить свое значение, поэтому оно меняется каждый раз.

Скажем, у меня есть элемент управления Label с именем "label". Вот что я хочу сделать:

Я хочу "привязать" значение label.Text к переменной X. Таким образом, что при изменении переменной X оно будет отражено обратно в label.Text.

Теперь я не хочу писать прослушиватели событий и играть с делегатами с этим (я хочу наименьшее количество кода, насколько это возможно). Есть ли способ использовать компонент DataBinding для этого? или какие-то другие новые методы?

4b9b3361

Ответ 1

Если вы хотите использовать инфраструктуру привязки данных и отражать изменения, внесенные в значение, вам нужно указать способ уведомления пользовательского интерфейса об изменениях, внесенных в значение привязки.

Итак, лучший способ сделать это - использовать свойство и реализовать интерфейс 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

Для многопоточной программы (то есть почти для каждой программы Windows Forms) ответ iCe не очень хороший, потому что он все равно не позволит вам поменять метку (вы получите ошибку перекрестного потока). Самый простой способ решить проблему - создать свойство в сеттере:

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

где updateLabelText (string) является потокобезопасным:

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

Я не думаю, что вы сможете привязываться к публичной переменной. Переменная сама по себе не имеет возможности уведомлять слушателей об изменении ее значения.

Вот почему вам нужно обернуть переменную в свойство. В установщике вы поднимаете событие, чтобы уведомить элементы управления пользовательского интерфейса, которые привязаны к нему, чтобы они могли обновлять и отображать новое значение. В структуре есть механизм для этого - INotifyPropertyChanged - попробуйте эту ссылку для практического.

Ответ 4

Создайте свойство для X. В setter обновите свойство label.Text.

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