0

CSLA を使用する古い .NET 1.1 Winforms アプリを、INotifyPropertyChanged インターフェイスの使用をサポートする .NET 4.0 およびそれ以降のバージョンの CSLA にアップグレードしました。

これを行う理由の大部分は、データバインディングが改善されることです。たとえば、検証時 (タブオフ) の代わりにバインディング時に変更を更新できるようになります。

カスタム ユーザー コントロール NumberBox があります。基本的には、数値型、小数点以下の桁数などのいくつかのプロパティを持つ単なるテキスト ボックスです。BindableValue という型オブジェクトのパブリック プロパティを公開しました。CSLA クラス (検証規則を継承する標準の .NET クラス、変更されたプロパティ、およびさまざまなもの)の整数プロパティをバインドしていたのはこのプロパティでした。この特定のケースでは、クラス プロパティは整数です。

アップグレードした私の問題は次のとおりです。

  1. 1234 などの値をナンバー ボックス コントロールに入力すると、オブジェクト バインディング ソースをカスタム BindableValue プロパティに設定しているにもかかわらず、タブを離すまで値がバインドされているクラスのプロパティに戻されません。更新モードをプロパティ変更に設定します。
  2. (1)のように値を入力した後、戻って値を削除すると、ナンバーボックスをタブで移動したりクリックしたりできなくなります。.NET 例外がスローされたときに VS2010 をスローするように設定しましたが、壊れていません。

WinForms の作業を始めてからしばらく経っているので、どこから始めればよいか少し迷っています。ヒントと解決策をいただければ幸いです。

編集: 私はさまざまなことを試しましたが、どこにも速くなりません.今は本当にイライラしています:

  1. MSDNの情報に従いました。つまり、ComplexBindingProperties 属性を追加しました。テキスト ボックスのプライベート keyUp イベント ハンドラーがわずかに異なります。リンクされた記事 OnBindableValueChanged() で示されているように、イベントを発生させます。ただし、すべての場合において、私のイベント BindableValueChanged は常に null です。
  2. (1) と同様の記事を読みましたが、EventHandler を使用してイベントを宣言する代わりに、PropertyChangedEventHandler を使用して、これと同じ結果を試しました。
  3. DefaultBindingProperty 属性を追加しました。
4

1 に答える 1

2

[この経験については、私の会社のブログでも読むことができます - OCC ブログ - Binding woes ]

私はついにそれを理解したので、ここで共有して、他の誰かがGoogleを介してトロールする退屈を救うと思いました.NET 4.0では機能するが、もはや適用されないようです.

さて、私がGoogleで読んでいた多くのことは、ユーザーコントロールがEventHandlerまたはPropertyChangedEventHandlerデリゲートのいずれかを使用してChangedイベントを持たなければならないと私に言い続けました-異なるページは異なるデリゲートを示しました。私は両方を試しました-失敗しました!

私が .NET 4.0 でしなければならなかったことは、実際にははるかに優れています。簡単に言えば、ユーザーコントロールをバインドしていたクラスと同じように、 INotifyPropertyChanged インターフェイスを実装する必要がありました。次に、ソースオブジェクトにプッシュバックしたいときに、ユーザーコントロールで PropertyChanged イベント (たとえば、PropertyChanged("BindableValue"); ) を発生させたところ、インターフェイスが定義されました。

上記はより洗練されたものですが、残念ながら、Google によってインデックス化された記事、フォーラム、および投稿は、.NET 4.0 ではまだこれに追いついていないため、既存のものはすべて行き詰まりと多くのフラストレーションをもたらします。これにより、他の誰かが多くの時間を節約できることを願っています。

于 2012-12-19T13:28:10.370 に答える