2012-01-19 9 views
6

Intentando unir una Cadena a una propiedad RichTextBox.Text para que cuando el valor de la Cadena cambie, ese cambio se refleje en el cuadro RichTextBox. Hasta ahora no he tenido éxito.Enlace de datos RichTextBox.Text a una cadena

string test = "Test"; 
rtxt_chatLog.DataBindings.Add("Text",test,null); 
test = "a"; 

Esto muestra "Prueba" en rtxt_chatLog, pero no en "a".

Incluso intenté agregar rtxt_chatLog.Refresh(); pero eso no hace ninguna diferencia.

Actualización 1: Esto no funciona bien:

datos
public class Test 
{ 
    public string Property { get; set; } 
} 

Test t = new Test(); 
t.Property = "test"; 
rtxt_chatLog.DataBindings.Add("Text", t, "Property"); 
t.Property = "a"; 

¿No soy yo la comprensión de unión correctamente?

+0

¿cuál es el propósito de que atas a una Cadena HardCoded ... no quieres ir en la dirección opuesta en lo que respecta a vinculante ... ¿qué estás realmente tratando de lograr? ¿Quieres datos dinámicos de lo que alguien escribe como un cuadro de edición para enlazar al ChatLog o estás realmente tratando de agregar datos a un ChatLog ...? – MethodMan

+0

Se vincula por valor, no por referencia. Eso significa que solo se pasa el valor actual de 'test' (" Test ") y ningún cambio en la variable' test' afectará al cuadro de texto. –

+0

¿Qué intenta lograr? Bueno, quiero mantener un registro de mensajes en una cadena en una ventana (detrás de las escenas) y luego, a petición del usuario, mostrar otra ventana que mostrará el contenido de la cadena desde el formulario principal en tiempo real.Quiero que la ventana se actualice, ya que la cadena en el formulario principal se actualiza. El fragmento de código es mi forma de probar el enlace. – user983110

Respuesta

4

El String clase no implementa INotifyPropertyChanged, así que no hay eventos para el origen de enlace para decirle al RichTextBox que algo ha cambiado.

intente actualizar su clase con el INotifyPropertyChanged implementado:

public class Test : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _PropertyText = string.Empty; 

    public string PropertyText { 
    get { return _PropertyText; } 
    set { 
     _PropertyText = value; 
     OnPropertyChanged("PropertyText"); 
    } 
    } 

    private void OnPropertyChanged(string propertyName) { 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

}

Además, parece que DataBinding no le gusta el nombre de "propiedad" de un nombre de propiedad. Intenta cambiarlo por otra cosa que no sea "Propiedad".

rtxt_chatLog.DataBindings.Add("Text", t, "PropertyText"); 
+0

Sí, eso funciona, sí vi algo sobre esa interfaz, pero esperaba que no fuera necesaria. – user983110

0

¿Por qué no simplemente establecer una propiedad para la variable de cadena y manejar la cadena a través de la propiedad siempre? Su más fácil de hacer en virtud de la incubadora: rtxt_chatLog.Text = test;

EDIT: de OP: Well, I want to keep a log of messages in a string in one window (behind the scenes) and then, at user's request, pop up another window that will list the contents of the string from the parent form in real time

Si desea acceder al contenido de una cadena única a petición del usuario, no necesitas nada de todo esto. Solo necesita manejar la solicitud del usuario y hacer rtxt_chatLog.Text = test bajo ese evento (probablemente algún manejador de eventos). Pero si usted necesita su RichTextBox a poblarse con cada nuevo valor para la cadena que puede hacer algo simple:

public string Test 
{ 
    set 
    { 
     test = value; 
     rtxt_chatLog.Text = test; 
    } 
    get { return test; } 
} 

La clave aquí es utilizar sólo la propiedad a través cabo para establecer los valores a la variable test. Por ejemplo, en el código no le hacen

test = "sdf"; 

Haz

Test = "sdf"; 

simple.

+0

Estoy confundido por lo que escribió y no puede seguirlo. Qué propiedad va con qué cadena, etc. Pero si miras mi primer comentario a mi pregunta, verás para qué necesito esto y la muestra de código que mostraste no parece funcionar. – user983110

+0

No del todo, a menos que estemos pensando de manera muy diferente para empezar. rtxt_chatLog es parte de mi formulario principal y tiene su propia función por separado, pero que utilicé temporalmente para las pruebas vinculantes. A petición del usuario, quiero abrir una ventana emergente con su propio RichTextBox que mostrará el contenido de la cadena que he agregado a lo largo de la vida de la aplicación. Entonces, con la forma en que estoy pensando, el segundo RichTextBox no aparece hasta que el usuario elige ver los mensajes, que de lo contrario se acumulan en el fondo desde el inicio de la aplicación. – user983110

+0

Dado que tengo que crear un objeto separado que implemente INotifyChangeProperty, vi que en realidad existen otros dos enfoques para resolver mi problema. Puedo hacer que la ventana emergente exponga que es RichTextBox y que se registre en mi formulario principal para que se rellene con código en el formulario principal. O bien, puedo crear mi propio evento que me permita crear manejadores de eventos más flexibles en los suscriptores en lugar de usar el PropertyChangeEventHandler predefinido. – user983110

Cuestiones relacionadas