0

このサイトを長い間使用した後、私はついに遭遇し続けている問題を解決し、それが私を夢中にさせました. 私は WPF TextBox を使用して、作成中のプログラムの進行状況を表示しているため、それをカスタム ログにバインドしました。ただし、テキストボックスは更新されません。私は何を間違っていますか?

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 ウェイのバインディングを試しましたが、今のところうまくいきません。ただし、2wayに設定してこのコードを使用すると

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

テキストボックス (ErrorConsole) は、1 文字入力するとすぐに適切なテキストに更新されます。

プログラムを磨くのはこれらのささいなことであるため、ここでの助けは非常に高く評価されます.

-ピーター

4

1 に答える 1