0

我有一个 StatusLogger 类,我想在整个项目中使用它来将消息记录到 TextBlock 中。不幸的是,我无法弄清楚如何正确地将它绑定到 TextBlock,因为我的类的某些部分是静态的。

XAML:

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

状态记录器类:

public class StatusLogger : INotifyPropertyChanged
{
    #region Fields

    private static StringBuilder _logText = new StringBuilder();

    #endregion

    #region Properties

    public string LogText
    {
        get { return _logText.ToString(); }
    }

    #endregion

    #region Methods

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

    #endregion

    #region Property Change Handler

    public event PropertyChangedEventHandler PropertyChanged;

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

    #endregion
}

因此,当我在使用它的第一个方法/类中调用我的 StatusLogger.WriteLine 时,消息实际上会发布。我的问题是我无法弄清楚如何在其他方法和类中持续使用 StatusLogger.WriteLine 并让 PropertyChangedEventHandler 将其拾取。因为我相信静态 WriteLine 正在创建 StatusLogger 的新实例?

我觉得这在我的 MainWindow 启动时也做错了。我可以在 WPF 中将 DateContext 设置为我的 StatusLogger 类吗?:

private readonly StatusLogger _statusLogger = new StatusLogger();
LogTextBlock.DataContext = _statusLogger;

有什么建议或更好的方法吗?

4

1 回答 1

0

静态WriteLine 是创建StatusLogger 的新实例吗?

不,它不会创建一个新实例。实际上,即使这样做也没关系,因为它_logText是静态的,因此在所有StatusLogger.

您需要在添加文本时引发属性更改事件,以提示 UI 进行更新。所以添加到WriteLine

public static void WriteLine(string text, params object[] args)
{
    _logText.AppendFormat(text + Environment.NewLine, args);
    OnPropertyChanged("LogText");
}
于 2013-08-14T00:25:58.520 回答