2013-08-14 5 views
0

메시지를 TextBlock에 기록하기 위해 전체 프로젝트를 통해 사용하려는 StatusLogger 클래스가 있습니다. 불행히도 내 클래스의 일부가 정적이기 때문에 TextBlock에 제대로 바인딩하는 방법을 알 수 없습니다.TextBlock PropertyChangedEventHandler로 텍스트 바인딩이 업데이트되지 않습니다.

XAML :

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

StatusLogger 클래스 : 나는 첫 번째 방법/나는 그것을 사용하는 클래스 내에서 내 StatusLogger.WriteLine를 호출 할 때

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을 지속적으로 사용하고 PropertyChangedEventHandler를 사용하는 방법을 파악할 수 없다는 것입니다. 정적 WriteLine이 StatusLogger의 새 인스턴스를 만들고 있다고 생각하기 때문에?

내 MainWindow가 시작될 때 잘못되었다고 생각합니다. DateContext를 WPF의 StatusLogger 클래스로 설정할 수 있습니까? :

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

어떤 제안이나 더 좋은 방법이 있습니까?

답변

0

정적 WriteLine이 StatusLogger의 새로운 인스턴스가됩니까?

아니요, 새 인스턴스를 만들지 않습니다. 실제로는 _logText이 정적이어서 모든 인스턴스에 걸쳐 StatusLogger에 공유되기 때문에 문제가되지 않습니다.

필요한 것은 UI를 업데이트하도록 큐에 넣기 위해 텍스트를 추가 할 때 속성 변경 이벤트를 발생시키는 것입니다. 그래서 WriteLine에 추가하십시오 :

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

나는 그것을 시도하고 그것이 정적이 아닌 방법 때문에 작동하지 않습니다. OnPropertyChanged를 정적으로 변경하면 : INotifyPropertyChanged가 엉망이됩니다. 결국 나는 그것을 작동시키지 못했습니다. – HuntK24

+0

응용 프로그램 시작시에만 메시지를 게시하는 것으로 보입니다. 일단 거기에 앉아 있으면, 그 이후의 모든 것은 더 이상 기록되지 않습니다. – HuntK24

+0

그래서 나는 한 시간을 낭비하고 PropertyChanged 객체는 항상 null입니다. 나는 그것이 새로운 메시지가 게시되지 않는 이유라고 생각합니다. – HuntK24

관련 문제