2009-05-08 7 views
0

私はASP.NET用のTwoWay Bindingコントロールを作成しています。ついに私は物事を働かせました。私はネストされたバインディングステートメントを持っているときネストされたプロパティを取得するためにリフレクションを使用するには

<%# Bind("Name") %> 

私が使用している反射技術が動作していない:これは、このような単純な例のために働く

private void RebindData() 
{ 
    // return if the DataValue wasn't loaded from ViewState 
    if (DataValue == null) 
     return; 
    // extract the values from the two-way binding template 
    IOrderedDictionary values = new OrderedDictionary(); 
    IBindableTemplate itemTemplate = DataTemplate as IBindableTemplate; 
    if (itemTemplate != null) 
    { 
     foreach (DictionaryEntry entry in itemTemplate.ExtractValues(this)) 
     { 
      values[entry.Key] = entry.Value; 
     } 
    } 

    // use reflection to push the bound fields back to the datavalue 
    foreach(var key in values.Keys) 
    { 
     var type = typeof(T); 
     var pi = type.GetProperty(key.ToString()); 
     if (pi != null) 
     { 
      pi.SetValue(DataValue, values[key], null); 
     } 
    } 
} 

:私は、次のコードを使用して再バインドしています

<%# Bind("Customer.Name") %> 

このようなネストされたプロパティに反射を使用する簡単な方法はありますか?このために再帰関数を使うべきか、それともループだけを使うべきですか?

答えて

1

これをサポートしているASP.NET DataBinderを使用しないのはなぜですか?

+0

私は、組み込みのASP.NET双方向バインディングを使用するためのさまざまなアプローチを研究しています。私のアプローチはFormViewと非常によく似ていますが、DataSourceをIEnumerableではなく単一アイテムにします。 – bendewey

+1

申し訳ありません...明確ではありませんでした。私は既に、サブプロパティの命名規則をサポートしているDataBinder.Evalメソッドを使って考えていました。 しかし、IEnumerableの問題に対処するには、コレクションに直接バインドする必要はありません。オブジェクトを直接作成し、そのオブジェクトのプロパティに名前でバインドすることができます。 –

関連する問題