2009-03-20 4 views
2

私はまだ、.NETで2通りのデータバインディングを行う「すてきな」方法を見つける必要があります。コントロールをクラスプロパティにバインドすることは技術的に可能ですか?

<asp:TextBox ID="TitleTextBox" 
      runat="server"   Text='<%# Bind("Title_oops_spelled_wrong") %>'> 

私が何かを持っているしたいと思います:
私は現在asp.net双方向データバインディングでは、たとえば好きではない一つのことは、aspxページに結合するのをやっている には、コンパイル時間、すなわち、チェックされていません

Class Binder 
Public Sub BindControl(ctl As Control, objectProperty As ???????) 
    '// Add ctl and objectProperty to a collection 

End Sub 

わからないことは、私の例でobjectPropertyを受け取る方法です。プロパティへの参照(つまり:ポインタ)を受け取りたいので、後ほど、この参照を介してプロパティから読み書きできます。

これはどういうわけか、代理人とおそらくできますか?

UPDATE:
注意が、私はバインディングのコレクションにコントロール参照を追加したい、このコレクションは、その後、結合およびバインド解除のために使用されます。

+0

バインディングは文字列ベースです。バインディング(ほとんどの場合)はリフレクションの形式を使用するためです。 – Tony

+0

はい、それは私の要点です、私は反射を使用したくありません! :) – tbone

+0

それと幸運= P私はほとんどがちょうどそれを受け入れたように。私はそれについてもっと考えると、あなた自身のバインディング方法などを設定することができますが、すべてのデザインタイムバインドサポートを失うことになります。 – Tony

答えて

2

.NETデータバインディングメカニズムを使用しないようにする理由はありますか。これは、コントロールの値とクラスのプロパティ値との間のパリティを維持して処理し、豊富なデザイン時サポートを提供します。いずれかをプログラムやデザイナーによって:

次の2つの方法でデータバインディングエンジンとインターフェースすることができます。基本的なデータバインディングをプログラム的に行うことは簡単です。"MyString"という名前の文字列プロパティを持つ "FooClass"という名前のクラスがあるとします。私はFooClassがfooという名前のインスタンスをフォームにmyTxtBoxという名前のTextBoxを持っていると私は、文字列MyStringのプロパティにバインドします:

myTxtBox.DataBindings.Add("Text", foo, "MyString"); 

これは、プロパティに割り当てられて取得するテキストボックスに更新を原因となります実行すると、他の場所からのプロパティの変更はTextBoxに反映されます。

さらに複雑なデータバインディングシナリオでは、プロジェクトにオブジェクトデータソースを作成し、フォームにBindingSourceを配置することをお勧めします。データソースを作成する際に具体的な手順が必要な場合はお手伝いできますが、一般的にはプロジェクトでソースを作成し、バインド先のクラスを選択します。フォームにBindingSourceを配置し、オブジェクトプロジェクトのデータソースをポイントしてから、Visual Studioデザイナを使用して、コントロールのプロパティをオブジェクトのプロパティにバインドします。次に、コード内のDataSourceプロパティを、バインドするクラスまたはコレクションのインスタンスに設定します。

私が知っている限り、プロパティは実際には関数のペア(get_とset_)であるため、「プロパティ代理人」はありません。

UPDATE:

私はあなたのコメントを読んで、私は、.NETデータが自動的にリフレクションを使用していない、でも制御レベルで、結合することを指摘したいと思います。データバインディングは、バインドされたコントロールとデータソースの両方について、型記述子とプロパティ記述子の周りに構築されます。これらの辺の一方または両方が特定のプロパティと型記述を実装していない場合、リフレクションが使用されますが、いずれの側もリフレクションを使用しない独自の記述プロファイルを自由に提供できることは事実です。

0

バインドする方法ではなく、結合関係を保持しているシーンの背後には、いくつかのオブジェクトがありません。これは、ページパーサーがコードを生成するために使用する単なる「魔法の」言葉です。本質的に、それは評価と制御の建物コードに変換されます。一方、Evalは、バインドされたアイテムのプロパティにアクセスするためにリフレクションを使用します。

私はあなたが望むものを正確に理解していれば、バインディングの読み取り専用プロパティが既に動作します。

<asp:TextBox ID="TitleTextBox" runat="server" Text='<%# Title %>' /> 

双方向の結合のために、あなたが持っているいずれかの独自のテンプレートを作成したり、既存のものを反映してExtractTemplateValuesMethod方法を渡し、自分のコントロールにDataBindingイベントを割り当てたい:あなたは、クラス内のプロパティのタイトルを持っていると仮定すると、 。これは.NETがEvalを使用するところで、プロパティの代入で置き換えます。

私の意見では、これがDataBindingイベントの対象です。

しかし、あなたが質問ならば、私は恐れていないよ、1プロパティへの参照を持つことができるかどうかについての詳細です。言うごとにプロパティはありません。メタデータのメソッド(取得と設定)とエントリを取得する必要があります。あなたはオブジェクトとプロパティ名への参照を格納することができますが、リフレクションを使用する必要があります。

あなたは、デリゲートを使用することができますが、1つの.NETはExtractTemplateValuesMethodを定義し、とにかくデータバインディングをやってされ、生成とそれは同じコードに戻ってあなたを取るでしょう。

0

解決策の1つは、objectProperty ByRefを渡すことです。

あなたは時の型チェックをコンパイルしたい場合は、あなたが使用する予定のすべてのタイプのためにBindControlをオーバーロードする必要があります。例:

Public Sub BindControl(ctl As ITextControl, ByRef objectProperty As String) 
    objectProperty = ITextControl.Text 
End Sub 

Public Sub BindControl(ctl As ITextControl, ByRef objectProperty As Integer) 
    Integer.TryParse(TextControl.Text, objectProperty) 
End Sub 
.. 
関連する問題