c# - español - Enlaza una etiqueta a una "variable"
databindings c# (4)
Digamos que tengo una variable global INT llamada X. Como X es global, podemos suponer que cualquier cosa puede modificar su valor para que se cambie cada vez.
Supongamos que tengo un control de etiqueta llamado "etiqueta". Esto es lo que quiero lograr:
Quiero "enlazar" el valor de la etiqueta. Texto a la variable X. De tal forma que cuando se cambie la variable X, se reflejará en la etiqueta. Texto.
Ahora, no quiero escribir oyentes de eventos y jugar con delegados con este (quiero la menor cantidad de código posible). ¿Hay alguna manera de usar el componente DataBinding para este? o alguna otra técnica novedosa?
Gracias, Ian
Cree una propiedad para X. En setter actualice la propiedad label.Text.
private int _x;
public int X {
get
{
return _x;
}
set
{
_x = value;
label.Text = _x.ToString();
}
}
No creo que puedas enlazar a una variable pública. Una variable en sí misma no tiene la capacidad de notificar a los oyentes sobre un cambio en su valor.
Es por eso que necesita envolver la variable en una propiedad. En el sistema establece un evento para notificar a los controles de la interfaz de usuario que están vinculados a él, para que puedan actualizar y mostrar el nuevo valor. El marco tiene un mecanismo para esto - INotifyPropertyChanged - prueba este enlace para obtener un instructivo.
Si desea utilizar la infraestructura de enlace de datos y reflejar los cambios realizados en un valor, necesita una forma de notificar a la UI sobre los cambios realizados en el valor de enlace.
Entonces, la mejor manera de hacerlo es usar una propiedad e implementar la interfaz INotifyPropertyChanged
, como esta:
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
}
También recuerde que primero necesita configurar el enlace en la etiqueta:
public frmFoo()
{
InitializeComponent();
lblTest.DataBindings.Add(new Binding("Text", this, "Foo"));
}
Para el programa de subprocesos múltiples (casi todos los programas de formularios de Windows), la respuesta de iCe no es buena, porque de todos modos no le permitirá cambiar la etiqueta (obtendrá algún error de cruce). La forma más sencilla de solucionar el problema es crear una propiedad en setter:
private string _labelText;
public string labelText
{
get { return _labelText; }
set
{
_labelText = value;
updateLabelText(_labelText); //setting label to value
}
}
donde updateLabelText (cadena) es seguro para subprocesos:
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;
}
}