2013-10-30 48 views
0

在長時間使用本站之後,我終於決定了一個我一直遇到的問題,這讓我發瘋。我一直在使用WPF文本框來顯示我正在編寫的程序的進度,因此我已將它綁定到自定義日誌。但是:文本框不會更新。我究竟做錯了什麼?無法從字符串中獲取TextBox更新OnPropertyChanged

在MainWindow.xaml.cs:

public MainWindow() 
{ 
    ... 
    DataContext = this; 
    ... 
} 

在主窗口。

<ScrollViewer Grid.Column="0" Grid.Row="2"> 
    <TextBox Name="ErrorConsole" AcceptsReturn="true" TextWrapping="Wrap" Margin="0,3,10,0" TextChanged="Console_TextChanged" Background="Black" Foreground="White" /> 
</ScrollViewer> 

而在用戶按下 「開始」 按鈕,執行該代碼的Log.cs

public class Log : INotifyPropertyChanged 
{ 
    private string _logText = ""; 

    private static Log instance; 

    public static string filename { get; set; } 
    public event PropertyChangedEventHandler PropertyChanged; 

    public static Log GetInstance() 
    { 
     if (instance == null) 
     { 
      instance = new Log(); 
     } 
     return instance; 
    } 

    public string logText 
    { 
     get 
     { 
      return _logText; 
     } 
     set 
     { 
      if (!(_logText == value)) 
      { 
       _logText = value; 
       OnPropertyChanged(SystemStrings.status_Updated); 
      } 
     } 
    } 

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

    //Adds custom messages to the logfile 
    public void Add(string message) 
    { 
     logText += (message + "\n"); 
     logText += SystemStrings.divider + "\n\n"; 
    } 

    public void AddSimple(string message) 
    { 
     logText += (message + "\n"); 
    } 

    //Cleans the log that is in memory 
    public void Clear() 
    { 
     logText = ""; 
    } 
} 

的那一刻:

Binding binding = new Binding(); 
binding.Source = Log.GetInstance(); 
binding.Mode = BindingMode.TwoWay; 
binding.Path = new PropertyPath(SystemStrings.status_Updated); 
BindingOperations.SetBinding(ErrorConsole, TextBox.TextProperty, binding); 

我曾嘗試結合1 2路,但目前還沒有運氣。但是:如果我把它設置爲2路和使用此代碼

private void Console_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    ErrorConsole.Text = Log.GetInstance().logText; 
} 

文本框(ErrorConsole)實際上會盡快更新到正確的文本當您輸入一個字符。

這裏任何幫助,將不勝感激,因爲這是那些小東西,拋光程序,該程序,儘管不是最先進的圖形之一,應該在我看來,至少使用不是很好。

-Peter

+0

一個靜態成員與'this'無關,所以當你調用'PropertyChanged(this,...)'時,它不適用於靜態屬性。 – Silvermind

+0

感謝您的回答,但您會建議如何綁定它? – Voidpaw

+0

作爲一個骯髒的黑客,你可以使你的屬性非靜態,並且你的屬性通過你的屬性返回靜態,唉。我不敢相信我這麼說。最好避免使用UI進行靜態。 – Silvermind

回答

0

原來有做它沒有正確的方法,但我設法通過了一下週圍玩一個(不那麼整齊使用)觀察的集合,以解決這一問題。感謝大家的幫助。