このサイトを長い間使用した後、私はついに遭遇し続けている問題を解決し、それが私を夢中にさせました. 私は 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 文字入力するとすぐに適切なテキストに更新されます。
プログラムを磨くのはこれらのささいなことであるため、ここでの助けは非常に高く評価されます.
-ピーター