#実現したいこと
WindowsFormsアプリケーションについてです。
BackgroundWorkerのIsBusyプロパティをTextBoxのEnabledへバインドしたい。
イベントで切り替えではなくバインドで実現したいです。
(バインドの使い方を覚えるためなので)
#試した内容
BackgroundWorkerを継承したコントロールへINotifyPropertyChangedを実装してみましたが、
BackgroundWorker動作中もTextBoxのEnabledがFalseになったままになってしまいます。
###Form1
Formには、button1とtextBox1とadvancedBackgroundWorker1を貼り付けています。
Form1_LoadでtextBox1へバインドしています。
button1をクリックするとadvancedBackgroundWorker1を動作させます。
advancedBackgroundWorker1動作中はtextBox1の表示を3,2,1とカウントダウンさせます。(このときに、textBox1のEnabledをTrueにしたい)
advancedBackgroundWorker1のCompletedでtextBox1の表示を0にします。(このときに、textBox1のEnabledをFalseにしたい)
C#
1using System; 2using System.ComponentModel; 3using System.Threading; 4using System.Windows.Forms; 5 6namespace WindowsFormsApp8 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void Form1_Load(object sender, EventArgs e) 16 { 17 advancedBackgroundWorker1.WorkerReportsProgress = true; 18 // バインド 19 textBox1.DataBindings.Add(new Binding("Enabled", advancedBackgroundWorker1, "IsBusy")); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 // Run 25 advancedBackgroundWorker1.RunWorkerAsync(); 26 } 27 28 private void advancedBackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 29 { 30 // カウントダウン 31 advancedBackgroundWorker1.ReportProgress(3); 32 Thread.Sleep(1000); 33 advancedBackgroundWorker1.ReportProgress(2); 34 Thread.Sleep(1000); 35 advancedBackgroundWorker1.ReportProgress(1); 36 Thread.Sleep(1000); 37 } 38 39 private void advancedBackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 40 { 41 textBox1.Text = e.ProgressPercentage.ToString(); 42 } 43 44 private void advancedBackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 45 { 46 textBox1.Text = "0"; 47 } 48 } 49}
###BackgroundWorker継承
BackgroundWorkerを継承しつつ、INotifyPropertyChangedも実装
OnDoWorkとOnRunWorkerCompletedをoverrideして、OnPropertyChangedを呼び出す。
C#
1using System; 2using System.ComponentModel; 3 4namespace WindowsFormsApp8 5{ 6 class AdvancedBackgroundWorker : BackgroundWorker , INotifyPropertyChanged 7 { 8 protected override void OnDoWork(DoWorkEventArgs e) 9 { 10 OnPropertyChanged("IsBusy"); 11 base.OnDoWork(e); 12 } 13 14 protected override void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e) 15 { 16 base.OnRunWorkerCompleted(e); 17 OnPropertyChanged("IsBusy"); 18 } 19 20 public event PropertyChangedEventHandler PropertyChanged; 21 protected virtual void OnPropertyChanged(String name) 22 { 23 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 24 } 25 } 26}
あなたの回答
tips
プレビュー