CSLA を使用する古い .NET 1.1 Winforms アプリを、INotifyPropertyChanged インターフェイスの使用をサポートする .NET 4.0 およびそれ以降のバージョンの CSLA にアップグレードしました。
これを行う理由の大部分は、データバインディングが改善されることです。たとえば、検証時 (タブオフ) の代わりにバインディング時に変更を更新できるようになります。
カスタム ユーザー コントロール NumberBox があります。基本的には、数値型、小数点以下の桁数などのいくつかのプロパティを持つ単なるテキスト ボックスです。BindableValue という型オブジェクトのパブリック プロパティを公開しました。CSLA クラス (検証規則を継承する標準の .NET クラス、変更されたプロパティ、およびさまざまなもの)の整数プロパティをバインドしていたのはこのプロパティでした。この特定のケースでは、クラス プロパティは整数です。
アップグレードした私の問題は次のとおりです。
- 1234 などの値をナンバー ボックス コントロールに入力すると、オブジェクト バインディング ソースをカスタム BindableValue プロパティに設定しているにもかかわらず、タブを離すまで値がバインドされているクラスのプロパティに戻されません。更新モードをプロパティ変更に設定します。
- (1)のように値を入力した後、戻って値を削除すると、ナンバーボックスをタブで移動したりクリックしたりできなくなります。.NET 例外がスローされたときに VS2010 をスローするように設定しましたが、壊れていません。
WinForms の作業を始めてからしばらく経っているので、どこから始めればよいか少し迷っています。ヒントと解決策をいただければ幸いです。
編集: 私はさまざまなことを試しましたが、どこにも速くなりません.今は本当にイライラしています:
- MSDNの情報に従いました。つまり、ComplexBindingProperties 属性を追加しました。テキスト ボックスのプライベート keyUp イベント ハンドラーがわずかに異なります。リンクされた記事 OnBindableValueChanged() で示されているように、イベントを発生させます。ただし、すべての場合において、私のイベント BindableValueChanged は常に null です。
- (1) と同様の記事を読みましたが、EventHandler を使用してイベントを宣言する代わりに、PropertyChangedEventHandler を使用して、これと同じ結果を試しました。
- DefaultBindingProperty 属性を追加しました。