Привязать метку к «переменной» - PullRequest
23 голосов
/ 30 июня 2010

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

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

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

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

Ответы [ 4 ]

31 голосов
/ 30 июня 2010

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

Так что лучший способ сделать этото есть использовать свойство и реализовать интерфейс 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"));
}
8 голосов
/ 19 июля 2012

Для многопоточной программы (то есть почти для каждой программы 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 голосов
/ 30 июня 2010

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

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

1 голос
/ 30 июня 2010

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

private int _x;
public int X {
    get 
    { 
        return _x; 
    } 
    set 
    { 
        _x = value;
        label.Text = _x.ToString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...