Канонический способ отображения данных в WPF - привязать к нему элемент управления (см. Привязка данных в MSDN). Это, вероятно, потребует, чтобы вы обернули или реорганизовали свой класс мессенджера, чтобы он предоставил привязываемые свойства. Например, ваш класс мессенджера может предоставлять свойство MessageText, которое вы обновляете каждый раз, когда получаете сообщение:
// INotifyPropertyChanged interface implementation and plumbing
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
}
// The property you are going to bind to
private string _messageText = String.Empty;
public string MessageText
{
get { return _messageText; }
set
{
_messageText = value;
OnPropertyChanged("MessageText");
}
}
// How to modify your code to update the bindable property
private void OnMessageReceive(string message) // assuming this method already exists
{
MessageText = MessageText + Environment.NewLine + message;
}
Теперь вы бы привязали свойство TextBox.Text к этому новому свойству:
<TextBox Text="{Binding MessageText, Mode=OneWay}" />
Это предполагает, что объект мессенджера установлен как DataContext окна, например когда окно создает мессенджер:
public class Window1()
{
_myMessenger = = new DanMessengerClient();
this.DataContext = _myMessenger;
}
Обратите внимание, что ваш класс мессенджера должен реализовывать INotifyPropertyChanged, чтобы это работало. Также обратите внимание на привязку OneWay, так что если пользователь редактирует TextBox, он не портит свойство MessageText. (Вы также можете использовать TextBlock, чтобы пользователь вообще не мог его редактировать.)
Когда вы настроите эту настройку, WPF будет автоматически отслеживать изменения в свойстве _myMessenger.MessageText и обновлять TextBox.Text по мере их появления (т.е. при получении сообщений).
Наконец, что касается отправки: просто передайте текст:
private void SendButton_Click(...)
{
_myMessenger.Send(MyTextBox.Text);
}
Используйте атрибут Name, чтобы присвоить имя текстовому полю, содержащему сообщение для отправки:
<TextBox Name="MyTextBox" />