2012-01-19 13 views
6

Tentativo di associare una stringa a una proprietà RichTextBox.Text in modo che quando il valore String cambia, tale modifica si riflette in RichTextBox. Finora non ho avuto successo.Databinding RichTextBox.Text a una stringa

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

Questa mostra "Test" nel rtxt_chatLog, ma non la "a".

Anche provato ad aggiungere rtxt_chatLog.Refresh(); ma questo non fa alcuna differenza.

Update 1: Questo non funziona neanche: binding correttamente

dati
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"; 

Sto non capire?

+0

qual è lo scopo del binding di una stringa HardCoded. vuoi dati dinamici da quello che qualcuno digita come una editbox per collegarsi al ChatLog o stai davvero provando ad aggiungere dati a un ChatLog ..? – MethodMan

+0

Si esegue il binding per valore, non per riferimento. Ciò significa che viene passato solo il valore corrente di 'test' (" Test ") e che nessuna modifica alla variabile' test' avrà effetto sulla casella di testo. –

+0

Cosa cerchi di ottenere? Bene, voglio tenere un registro dei messaggi in una stringa in una finestra (dietro le quinte) e poi, su richiesta dell'utente, far apparire un'altra finestra che elencherà il contenuto della stringa dal modulo padre in tempo reale.Voglio che la finestra si aggiorni, poiché la stringa nel modulo padre viene aggiornata. Lo snippet di codice è il mio modo di testare l'associazione. – user983110

risposta

4

Il String classe non implementa INotifyPropertyChanged, quindi non ci sono eventi per la fonte vincolante per dire al RichTextBox che qualcosa è cambiato.

prova ad aggiornare i classe con il INotifyPropertyChanged implementato:

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)); 
    } 

}

Inoltre, sembra che DataBinding non piace il nome "Proprietà" per un nome di proprietà. Prova a cambiarlo in qualcosa di diverso da "Proprietà".

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

Sì, funziona, ho visto qualcosa su quell'interfaccia ma speravo che non sarebbe stato necessario. – user983110

0

Perché non impostare solo una proprietà per la variabile stringa e gestire sempre la stringa tramite la proprietà? La sua più semplice da fare sotto il setter: rtxt_chatLog.Text = test;

EDIT: da 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

Se si desidera elencare il contenuto di una stringa solo su richiesta dell'utente, avete bisogno di niente di tutto questo. Basta gestire la richiesta dell'utente e fare rtxt_chatLog.Text = test sotto quell'evento (probabilmente qualche eventhandler). Ma se è necessario il RichTextBox a essere popolato con ogni nuovo valore per la stringa che si può fare qualcosa di semplice:

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

La chiave qui è quello di utilizzare solo la proprietà attraverso fuori per impostare i valori alla variabile test. Ad esempio, nel codice non lo fate

test = "sdf"; 

fare

Test = "sdf"; 

semplice.

+0

Sono confuso da ciò che hai scritto e incapace di seguirlo. Quale proprietà va con quale stringa, ecc. Ma se guardi il mio primo commento alla mia domanda, vedrai per cosa ho bisogno di questo e l'esempio di codice che hai mostrato non sembra che farebbe il trucco. – user983110

+0

Non proprio, a meno che non stiamo pensando in modo molto diverso per cominciare. rtxt_chatLog è parte del mio modulo principale e ha la sua funzione separata, ma che ho usato temporaneamente per il test di binding. Su richiesta dell'utente, voglio aprire una finestra con il proprio RichTextBox che mostrerà il contenuto della stringa che ho appeso a tutta la vita dell'app. Quindi, con il modo in cui sto pensando, il secondo RichTextBox non viene creato fino a quando l'utente non sceglie di visualizzare i messaggi, che vengono accumulati in background dall'avvio dell'applicazione. – user983110

+0

Dato che devo creare un oggetto separato che implementa la proprietà INotifyChange, ho visto che ci sono effettivamente altri 2 approcci per risolvere il mio problema. Posso avere la finestra pop-up esporre è RichTextBox e farlo registrare nel mio modulo principale in modo che sarà popolato dal codice nel modulo principale. Oppure, posso creare il mio evento personale che mi consenta di creare gestori di eventi più flessibili negli abbonati anziché utilizzare PropertyChangeEventHandler predefinito. – user983110