2012-01-19 18 views
6

Próbujesz powiązać ciąg z właściwością RichTextBox.Text, aby po zmianie wartości ciągu zmiana została odzwierciedlona w RichTextBox. Do tej pory nie udało mi się.Databinding RichTextBox.Text na ciąg znaków

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

To pokazuje "Test" w pliku rtxt_chatLog, ale nie "a".

Nawet próbowano dodać rtxt_chatLog.Refresh(); ale to nie ma znaczenia.

Aktualizacja 1: To nie działa albo: wiązanie prawidłowo

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

jestem nie rozumiejąc danych?

+0

jaki jest twój cel wiążący łańcuch HardCoded ... czy nie chcesz iść w przeciwnym kierunku w odniesieniu do wiązania .. co naprawdę chcesz osiągnąć? czy chcesz uzyskać dane dynamiczne z tego, co ktoś wpisze w polu edycji, aby powiązać się z dziennikiem czatu, czy naprawdę próbujesz dołączyć dane do czatu Chatlog? – MethodMan

+0

Wiążesz przez wartość, a nie przez odniesienie. Oznacza to, że tylko bieżąca wartość 'test' (" Test ") jest przekazywana i żadne zmiany w zmiennej' test' nie wpłyną na pole tekstowe. –

+0

Co próbujesz osiągnąć? Cóż, chcę przechowywać dziennik wiadomości w ciągu znaków w jednym oknie (za kulisami), a następnie, na żądanie użytkownika, pojawi się inne okno, które wyświetli zawartość ciągu z formularza nadrzędnego w czasie rzeczywistym.Chcę, aby okno było aktualizowane, ponieważ ciąg znaków w formularzu nadrzędnym jest aktualizowany. Fragment kodu jest moim sposobem testowania powiązania. – user983110

Odpowiedz

4

String klasa nie implementuje INotifyPropertyChanged, więc nie ma wydarzenia do źródła wiązania powiedzieć RichTextBox, że coś się zmieniło.

Spróbuj zaktualizować swoją klasę z INotifyPropertyChanged wdrożonego:

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

}

Również wygląda DataBinding nie lubi nazwy „własność” dla nazwy właściwości. Spróbuj zmienić go na coś innego niż "Właściwość".

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

Tak, to działa, widziałem coś o tym interfejsie, ale miałem nadzieję, że nie będzie to potrzebne. – user983110

0

Dlaczego nie wystarczy ustawić właściwość dla zmiennej łańcuchowej i traktować ciąg przez właściwość zawsze? Jest prostsze do zrobienia pod seter: rtxt_chatLog.Text = test;

EDIT: z PO: 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

Jeśli chcesz wyświetlić zawartość ciąg tylko na żądanie użytkownika, musisz nic to wszystko. Wystarczy zająć się żądaniem użytkownika i wykonać rtxt_chatLog.Text = test pod tym zdarzeniem (prawdopodobnie niektóre zdarzenia). Ale jeśli potrzebny RichTextBox być wypełniane przy każdej nowej wartości dla łańcucha można zrobić coś prostego:

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

Kluczem tutaj jest, że używa tylko właściwość przechodzące przez ustawienie wartości zmiennej test. Na przykład, w kodzie dont

test = "sdf"; 

Czy

Test = "sdf"; 

proste.

+0

Jestem zdezorientowany tym, co napisałeś i nie możesz go wykonać. Która właściwość pasuje do której struny itp. Ale jeśli spojrzysz na mój pierwszy komentarz do mojego pytania, zobaczysz, czego potrzebuję, a przykład kodu, który pokazałeś, nie wydaje się, żeby to działało. – user983110

+0

Nie do końca, chyba że na początku myślimy inaczej. rtxt_chatLog jest częścią mojej głównej postaci i ma własną osobną funkcję, ale którą tymczasowo wykorzystałem do wiązania testów. Na życzenie użytkownika chcę wyświetlić okno z własnym tekstem RichTextBox, który wyświetli zawartość ciągu, do którego dodawałem przez cały okres użytkowania aplikacji. Tak więc myślę, że drugi RichTextBox nie istnieje, dopóki użytkownik nie zdecyduje się wyświetlić wiadomości, które w przeciwnym razie są gromadzone w tle od początku aplikacji. – user983110

+0

Biorąc pod uwagę, że muszę utworzyć oddzielny obiekt, który implementuje INotifyChangeProperty widziałem, że są faktycznie na dwa inne podejścia do rozwiązania mojego problemu. Mogę mieć wyskakujące okno eksponować RichTextBox i mieć go zarejestrowany w moim głównym formularzu, tak aby został wypełniony przez kod w głównej formie. Lub mogę utworzyć własne wydarzenie, które pozwoli mi tworzyć bardziej elastyczne narzędzia obsługi zdarzeń w subskrybentach, w przeciwieństwie do korzystania z predefiniowanego PropertyChangeEventHandler. – user983110

Powiązane problemy