0

このコード行を使用して、TextBox コントロールをオブジェクトにデータバインドしています。

textBox1.DataBindings.Add("Text", myObject, "Text", false, DataSourceUpdateMode.OnPropertyChanged);

期待どおりに動作します。ただし、更新モードを OnValidation に変更すると、データバインディングは Object->Control の一方通行でのみ機能します。つまり、検証時にテキストボックスに何かを入力すると、値はオブジェクトの Text プロパティの値にリセットされます。その逆ではありません。

テスト プロジェクトでこの問題を再現しようとしましたが、失敗しました。すべての「より単純な」バージョンは期待どおりに機能しています。

私が言えることは、 INotifyPropertyChanged プロパティが抽象クラスに実装されているということです。私のオブジェクトはそのクラスを継承します。また、TextBox コントロールが作成され、実行時にデータバインドされてからフォームに追加されます。私はテストプロジェクトでそれをすべて試しましたが、うまくいったので、ここに何かが欠けています。

これをデバッグする方法に関するヒントは大歓迎です。ありがとう。

4

1 に答える 1

3

データ バインディングの問題をデバッグするときは、Binding.Parse および Binding.Format イベントにハンドラーを追加することがよくあります。

    Binding b = new Binding("Text", myObject, "Text", false, DataSourceUpdateMode.OnValidation);
    b.Format += new ConvertEventHandler(formatHandler);
    b.Parse += new ConvertEventHandler(parseHandler);
    textBox1.DataBindings.Add(b);
    private void formatHandler(object sender, ConvertEventArgs e)
    {
        //put code and breakpoint here to inspect e.Value
    }

    private void parseHandler(object sender, ConvertEventArgs e)
    {
        //put code and breakpoint here to inspect e.Value
    }

Parse イベントは、コントロールのバインドされた値が変更され、基になるデータ ソースにプッシュされるときに発生します。あなたの場合、これはコントロールが検証されたときにのみ発生します。

Format イベントは、基になるデータ ソースが変更され、値をコントロールにプッシュする必要がある場合に発生します。

まず、Parse イベントが発生しているかどうかを確認できます。そうでない場合は、コントロールの検証が失敗していると思われます。

これがデバッグに役立つことを願っています。

乾杯

于 2013-11-06T19:32:08.717 に答える