Суть проблемы в том, что вам нужен не только список описаний полей и имен, но и реальный объект, который имеет эти поля и имена.
Вы можете использовать конвертер, который добавляет целевые ссылки к объектам поля и предоставляет средство доступа к значениям, например:
public class PropertyValueAccessConverter : IMultiValueConverter
{
object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var target = values[0];
var fieldList = values[1] as IEnumerable<KeyValuePair<string,string>>;
return
from pair in fieldList
select new PropertyAccessor
{
Name = pair.Name,
Target = target,
Value = target.GetType().GetProperty(target.Value),
};
}
object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new InvalidOperationException();
}
public class PropertyAccessor
{
public string Name
public object Target;
public PropertyInfo Property;
public object Value
{
get { return Property.GetValue(Target, null); }
set { Property.SetValue(Target, value, null); }
}
}
public static PropertyValueAccessConverter Instance = new PropertyValueAccessConverter();
}
С помощью этого конвертера вы можете связать свой ItemsSource следующим образом:
<ListView>
<ListView.ItemsSource>
<MultiBinding Converter="{x:Static local:PropertyValueAccessConverter.Instance}">
<Binding />
<Binding Path="Fields" />
</MultiBinding>
</ListView.ItemsSource>
</ListView>
Кстати, гораздо более эффективный способ реализации вашего свойства Fields:
public IEnumerable<KeyValuePair<string, string>> Fields
{
get
{
return new KeyValuePair<string, string>[]
{
new KeyValuePair<string, string>("Apple Label", "Apple");
new KeyValuePair<string, string>("Orange Label", "Orange");
}
}
}
Хотя, честно говоря, я бы использовал атрибуты описания для отдельных свойств вместе с отражением вместо жесткого кодирования списка. Это также исключило бы необходимость MultiBinding в первую очередь.