通过TextBlock文本绑定追加多行?

时间:2013-08-13 19:16:15

标签: wpf binding textblock

所以我创建了一个TextBlock,我想记录我的所有消息,但此刻我被卡住了,我一次只发布1条消息并覆盖上一条消息。我目前的代码:

XAML:

<TextBlock Name="LogTextBlock" Foreground="Silver"
           Height="480" Width="588" Margin="10,10,0,0"
           HorizontalAlignment="Left" VerticalAlignment="Top">
       <TextBlock.Text>
            <MultiBinding StringFormat="{}{0}">
                 <Binding Path="LogText" />
            </MultiBinding>
       </TextBlock.Text>
 </TextBlock>

代码:

    public class StatusLogger : INotifyPropertyChanged
    {
        private static string _logText;

        public string LogText
        {
            get { return _logText; }
            set
            {
                if (_logText == value) return;

                _logText = value;
                OnPropertyChanged("LogText");
            }
        }

        public static void WriteLine(string text, params object[] args)
        {
            _logText = String.Format(text, args);
        }

        #region Property Change Handler

        public event PropertyChangedEventHandler PropertyChanged;

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

        #endregion
    }

我使用StatusLogger的方式是在我的代码中静态使用它,例如

StatusLogger.WriteLine("{0}: Testing the first message!{1}", DateTime.Now, Environment.NewLine);
StatusLogger.WriteLine("{0}: Testing the second message!{1}", DateTime.Now, Environment.NewLine);

基本上,它一次显示一行,但我希望它显示我添加到其中的每一行的历史记录。我尝试了几种不同的方式,但我现在发布了我目前所拥有的内容。

1 个答案:

答案 0 :(得分:4)

问题是WriteLine()方法会覆盖_logText中的任何内容,返回值为String.Format()。因此,您可以有效地用新行替换之前记录的行。

更好的方法可能是使用StringBuilder,特别是如果您预计会显示很多行:

public class StatusLogger : INotifyPropertyChanged
{
    private static StringBuilder _logText = new StringBuilder();

    public string LogText
    {
        get { return _logText.ToString(); }
        set
        {
            _logText = new StringBuilder(value);
            OnPropertyChanged("LogText");
        }
    }

    public static void WriteLine(string text, params object[] args)
    {
        _logText.AppendFormat(text + Environment.NewLine, args);
    }
}