0

イベントを介して別のビューからビューを更新したいと思います。現時点では、私はそれを行う方法がわかりません?.

私の場合: 計算エンジンがあり、計算を実行するときに、実行されたステップについてユーザーに通知したいと考えています。RichTextBoxそこで、目的の情報を表示するためのコントロールを含む新しいウィンドウを開きます。新しいステップが実行されたときに、別のウィンドウにテキストを表示するためにイベントを発生させたい ( RichTextBox)。

これを行うのに役立つ例はありますか?

4

2 に答える 2

0

基本的に、ビューを直接変更するのではなく、代わりにモデルまたは「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 独自の変更通知メカニズムも使用する必要があります。しかし、舞台裏でこれを行うには、先に進む前にまずコンセプトを理解する必要があると思います.

于 2012-08-17T09:18:10.627 に答える
0

コンパイルチェックなしで追加しただけです。タイプミスに注意してください。

public partial class Form1: Form {
    protected void btnCalculation_Click(object sender, EventArgs e) {
        var form2 = new Form2();
        form2.RegisterEvent(this);
        form2.Show();
        OnCalculationEventArgs("Start");
        // calculation step 1...
        // TODO
        OnCalculationEventArgs("Step 1 done");
        // calculation step 2...
        // TODO
        OnCalculationEventArgs("Step 2 done");
    }

    public event EventHandler<CalculationEventArgs> CalculationStep;
    private void OnCalculationStep(string text) {
        var calculationStep = CalculationStep;
        if (calculationStep != null)
            calculationStep(this, new CalculationEventArgs(text));
    }
}

public class CalculationEventArgs: EventArgs {
    public string Text {get; set;}
    public CalculationEventArgs(string text) {
        Text = text;
    }
}

public partial class Form2: Form {
    public void RegisterEvent(Form1 form) {
        form1.CalculationStep += form1_CalculationStep;
    }

    private void form1_CalculationStep(object sender, CalculationEventArgs e) {
        // Handle event.
        // Suppose there is a richTextBox1 control;
        richTextBox1.Text += e.Text;
    }
}
于 2012-08-17T09:19:05.517 に答える