0

在使用了这个网站很长时间之后,我终于决定了一个我一直遇到的问题,这让我发疯了。我一直在使用 WPF 文本框来显示我正在编写的程序的进度,因此我已将其绑定到自定义日志。但是:文本框不会更新。我究竟做错了什么?

在 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-way 和 2-way,但到目前为止还没有运气。但是:如果我将其设置为 2way 并使用此代码

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

只要您键入一个字符,文本框 (ErrorConsole) 实际上就会更新为正确的文本。

这里的任何帮助都将不胜感激,因为正是这些小东西润饰了程序,尽管它不是图形最先进的程序,但在我看来至少应该使用得很好。

-彼得

4

1 回答 1

0

Turns out there is no proper way to do it, but I managed to solve the issue by playing around a bit with a (not so neatly used) Observable Collection. Thanks for the help everyone.

于 2013-11-27T08:40:15.600 回答