基本的に、ビューを直接変更するのではなく、代わりにモデルまたは「ViewModel」を操作することを常にお勧めします。だからここに私が提案するものがあります:
計算用の ViewModel を定義します。
public class CalculationViewModel
{
public event Action ResultChanged;
private string _result = string.Empty;
public string Result
{
get { return _result; }
set { _result = value; Notify(); }
}
private void Notify()
{
if (ResultChanged!= null)
{
ResultChanged();
}
}
}
あなたのビュー(結果を表示するあなたが言及したフォーム)はそれにサブスクライブします。モデルの設定に使用できるプロパティがあります。
private CalculationViewModel _model;
public CalculationViewModel Model
{
get { return _model; };
set
{
if (_model != null) _model.ResultChanged -= Refresh;
_model = value;
_model.ResultChanged += Refresh;
};
}
public void Refresh()
{
// display the result
}
これらをまとめたコードができます (必要に応じてコントローラーと呼んでもかまいません)。
var calculationModel = new CalculationViewModel();
var theForm = new MyForm(); // this is the form you mentioned which displays the result.
theForm.Model = calculationModel;
var engine = new CalculationEngine();
engine.Model = calculationModel;
このコードは、モデル、エンジン、およびビューを作成します。モデルはエンジンだけでなくビューにも挿入されます。その時までに、ビューはモデルへの変更をサブスクライブします。エンジンが実行されると、結果がモデルに保存されます。モデルはサブスクライバーに通知します。ビューは通知を受け取り、独自の Refresh() メソッドを呼び出してテキスト ボックスを更新します。
これは簡単な例です。それを出発点としてください。特に、WinForms は独自のデータ バインディング メカニズムを提供するため、「Refresh」というコードを作成する代わりに、その DataSource プロパティを使用してテキスト ボックスをモデルにバインドします。これには、WinForm 独自の変更通知メカニズムも使用する必要があります。しかし、舞台裏でこれを行うには、先に進む前にまずコンセプトを理解する必要があると思います.