0

我正在使用 DataGrid 中的 DataBinding。我有一个视图模型,它有一个名为MyDataSource的 List 类型的属性。Class1 有一个名为MyList的属性,类型为 List。Class2 有一个名为MyProperty的字符串类型的属性。

我的 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。

我遵循以下链接中描述的方法。但是这里 MyList[0] 的 PropertyInfo 为空。 http://www.java2s.com/Code/CSharp/Reflection/Getsapropertysparentobject.htm

编辑:

我还尝试了以下代码:

PropertyInfo pInfo = MyDataSource.GetType().GetProperty(MyList[0].MyProperty)

但是 pInfo 在这里返回 null 。

有人可以建议我一个解决方案吗?

4

1 回答 1

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");
    }
  }
于 2012-10-17T09:14:48.340 回答