无法让TextBox从字符串更新OnPropertyChanged

时间:2013-10-30 09:10:56

标签: c# textbox updating

在使用这个网站很长一段时间之后,我终于找到了一个我遇到的问题并且让我发疯。我一直在使用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

1 个答案:

答案 0 :(得分:0)

原来没有正确的方法可以做到这一点,但我设法通过玩一个(不那么整齐的)Observable Collection来解决这个问题。感谢大家的帮助。