残念ながらコード ビハインドなしでは不可能ですが、リフレクション と を使用するとdynamic
、これを実行できるコンバーターを作成できます ( がなくても可能dynamic
ですが、より複雑になります)。
public class IndexerConverter : IValueConverter
{
public string CollectionName { get; set; }
public string IndexName { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Type type = value.GetType();
dynamic collection = type.GetProperty(CollectionName).GetValue(value, null);
dynamic index = type.GetProperty(IndexName).GetValue(value, null);
return collection[index];
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
以下をリソースに入れます。
<local:IndexerConverter x:Key="indexerConverter" CollectionName="Items" IndexName="Index" />
次のように使用します。
<Label Content="{Binding Converter={StaticResource indexerConverter}}"/>
編集:値が変更されたときに以前のソリューションは適切に更新されません。これは次のとおりです。
public class IndexerConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
return ((dynamic)value[0])[(dynamic)value[1]];
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
リソース:
<local:IndexerConverter x:Key="indexerConverter"/>
使用法:
<Label>
<MultiBinding Converter="{StaticResource indexerConverter}">
<Binding Path="Items"/>
<Binding Path="Index"/>
</MultiBinding>
</Label>