0

メッセージを TextBlock に記録するためにプロジェクト全体で使用したい StatusLogger クラスがあります。残念ながら、クラスの一部が静的であるため、TextBlock に適切にバインドする方法がわかりません。

XAML:

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

StatusLogger クラス:

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の起動時にも、これが間違っているように感じます。DateContext を WPF の 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 に答える