2016-05-20 3 views
0

Я пытаюсь заставить TextBox показать свойство stringBody свойства CurrentDialog окна. Вот XAML часть:Связывание TextBox с объектом WPF

<TextBox x:Name="ComposerBox" Height="90.302" Margin="311,0,141.355,10" 
... 
Text="{Binding Body}" 
ScrollViewer.CanContentScroll="True" SpellCheck.IsEnabled="True"  
VerticalAlignment="Bottom"> 

Вот строка из конструктора окон:

MessagingBox.DataContext = CurrentDialog; 

Я также попытался установить DataContext к этому без результата. Вот как определяется CurrentDialog:

private MessageDialog CurrentDialog { get; set; } 

Вот определение класса MessageDialog:

[Serializable][DataContract] 
public class MessageDialog 
{ 
    public string Name { get; private set; } 
    public UserData User { get; private set; } 

    private List<Message> Dialog = new List<Message>(); 
    public string Body { get; private set; } 

    public MessageDialog(UserData data) 
    { 
     Name = data.Username; 
     User = data; 
     Body = ""; 
    } 

    public void Add(Message msg) 
    { 
     Dialog.Add(msg); 
     Body += $"{msg.From}: {msg.Body} \n\n"; 
    } 

} 

}

Привязка не работает. Я также хочу, чтобы это было односторонним.

+0

Без хорошего [mcve], который надежно воспроизводит проблему, невозможно точно знать, почему ваш код не работает. Однако предлагаемый ответ - хорошее предположение. Если вы ожидаете, что свойство «Text» будет обновлено при изменении исходного свойства «Body», вам необходимо предоставить WPF, чтобы узнать, когда это происходит на самом деле. 'INotifyPropertyChanged' - обычный способ сделать это. –

ответ

0

Text="{Binding CurrentPerson.Body}" 

Не уверен, почему связывании путь содержит CurrentPerson, когда он должен быть CurrentDialog, но даже то, что не должно быть там. Поскольку DataContext уже установлен в CurrentDialog, вы можете просто связать текст:

Text="{Binding Body}" 

Вы должны реализовать INotifyPropertyChanged, поэтому WPF знать, когда свойство изменилось:

[Serializable][DataContract] 
public class MessageDialog : INotifyPropertyChanged 
{ 
    #region public string Body 
    private string m_Body; 
    public string Body 
    { 
     get { return m_Body; } 
     private set 
     { 
      if (m_Body == value) 
       return; 

      m_Body = value; 
      this.NotifyPropertyChanged(); 
     } 
    } 
    #endregion 

    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName]string propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 
+0

Текст = "{Binding CurrentPerson.Body}" из одной из попыток, я удалил ее, все еще не работает –

Смежные вопросы