我在DataGrid中使用DataBinding。我有一个viewmodel,它有一个名为 MyDataSource 的属性,类型为List。 Class1有一个名为 MyList 的属性,类型为List。 Class2有一个名为 MyProperty 的属性,类型为string。
我的DataGrid xaml看起来像。
<DataGrid ItemsSource="{Binding MyDataSource}">
<DataGrid.Columns>
<DataGridTextColumn Header="MyValue" Binding="{Binding Path=MyList[0].MyProperty}"/>
</DataGrid.Columns>
</DataGrid>
在这里,我可以在代码中访问PropertyPath MyList [0] .MyProperty 和MyDataSource。现在我想通过在GetProperty方法中传递 MyList [0] .MyProperty 来找到 MyProperty 的PropertyType。
我按照以下链接中描述的方法进行操作。但是这里的PropertyInfo对于MyList [0]是空的。 http://www.java2s.com/Code/CSharp/Reflection/Getsapropertysparentobject.htm
编辑:
我也尝试了以下代码:
PropertyInfo pInfo = MyDataSource.GetType().GetProperty(MyList[0].MyProperty)
但是pInfo在这里返回null。
有人可以建议我一个解决方案吗?
答案 0 :(得分:1)
不确定要实现的目标,但可以使用ValueConverter,如:
class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var typeName = ((Class2)value).GetType().GetProperty((string) parameter);
return typeName.ToString();
}
和XAML绑定:
<Window x:Class="ThemeTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:conv="clr-namespace:ThemeTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<conv:MyConverter x:Key="propertyToParentTypeConverter"/>
</Window.Resources>
...
<DataGrid ItemsSource="{Binding MyDataSource}">
<DataGrid.Columns>
<DataGridTextColumn Header="MyValue">
<DataGridTextColumn.Binding>
<Binding Converter="{StaticResource propertyToParentTypeConverter}" ConverterParameter="MyProperty" Path="MyList[0]" />
</DataGridTextColumn.Binding>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
如果您需要遍历一个属性链,其中一个属性是一个集合,那么您可以通过以下方式使用反射:
PropertyInfo pInfo = myObject.GetType().GetProperty("MyDataSource");
if (pInfo != null && pInfo.PropertyType.FullName.StartsWith("System.Collections"))
{
foreach (object obj in ((IEnumerable)pInfo.GetValue(myObject, null)))
{
PropertyInfo pInfoElement = obj.GetType().GetProperty("MyList");
}
}