10

私は持っているクラスを持っています

ObservableCollection<int>

プロパティとして、そのクラスのインスタンスのそのプロパティ内の値を変更しようとしています。ここに私が持っているコードがあり、それはTargetExceptionを取得しています:

object[] index = null;
var originalPropertyName = propertyName;
if (propertyName.Contains("[") && propertyName.Contains("]"))
{
    index = new object[1];
    index[0] = Convert.ToInt32(propertyName.Split('[')[1].Split(']')[0]);
    propertyName = propertyName.Split('[')[0];
}
PropertyInfo pi = item.GetType().GetProperty(propertyName);
PropertyInfo opi = item.GetType().GetProperty(originalPropertyName);
Type pType = index != null ? pi.PropertyType.GetGenericArguments()[0] : pi.PropertyType;
if (pi != null)
{
    object convertedValue = Convert.ChangeType(value, pType);
    if (index == null)
    {
        item.GetType().GetProperty(propertyName).SetValue(item, convertedValue, null);
    }
    else
    {
        //PropertyInfo ipi = pi.PropertyType.GetProperties().Single(p => p.GetIndexParameters().Length > 0);
        //var collection = pi.GetValue(item, index);
        //collection.GetType().GetProperty("Value").SetValue(collection, convertedValue, null);
        var _pi = pi.PropertyType.GetProperty("Item");
        _pi.SetValue(pi, convertedValue, index);
    }
}

propertyName の取得方法は上に示されていませんが、インデックス付きプロパティの場合、たとえば "IndexedProperty[10]" として開始されます。

「else」の後のコメントでは、他のスタックオーバーフローの投稿や他のフォーラムでこれを行う方法を読むことで、私が試したことを確認できますが、これまでのところ失敗しています。何か案は?

これを動的にしたいので、プロパティを ObservableCollection にキャストすることはできません。

全体の概念は、プロパティがインデックス化されているかどうかに関係なく、各インスタンスの適切なプロパティを更新することにより、データバインドされた DataGrid を作成し、貼り付けを正しく行うことです。インデックスのないプロパティは問題なく動作しますが、ObservableCollection のプロパティを動作させることができません。

4

2 に答える 2