在使用这个网站很长一段时间之后,我终于找到了一个我遇到的问题并且让我发疯。我一直在使用WPF TextBox来显示我正在编写的程序的进度,因此我将其绑定到自定义日志。但是:文本框不会更新。我做错了什么?
在MainWindow.xaml.cs中:
public MainWindow()
{
...
DataContext = this;
...
}
在MainWindow。
<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);
我尝试过单向和双向绑定,但到目前为止还没有运气。但是:如果我把它设置为2way并使用此代码
private void Console_TextChanged(object sender, TextChangedEventArgs e)
{
ErrorConsole.Text = Log.GetInstance().logText;
}
只要输入单个字符,文本框(ErrorConsole)就会实际更新为正确的文本。
这里的任何帮助都会受到高度赞赏,因为正是那些能够润滑程序的小东西,尽管不是图形上最先进的程序,但我认为它应该至少有点好看。
-Peter
答案 0 :(得分:0)
原来没有正确的方法可以做到这一点,但我设法通过玩一个(不那么整齐的)Observable Collection来解决这个问题。感谢大家的帮助。