2
Public Class View
    Public Property Items As String() = {"One", "Two", "Three"}
    Public Property Index As Integer = 0
End Class

そのインスタンスは、この XAML の DataContext として設定されます。

<Window>
    <StackPanel>
        <ListBox ItemsSource="{Binding Items}" SelectedIndex="{Binding Index}"/>
        <Label Content="{Binding Items[Index]}"/>
    </StackPanel>
</Window>

しかし、これはうまくいきません。

<Label Content="{Binding Items[{Binding Index}]}"/>

これも。

<Label Content="{Binding Items[0]}"/>

これは機能します。

追加のプロパティを表示する以外に解決策はありますか? XAML で直接何か?

4

3 に答える 3

3

残念ながらコード ビハインドなしでは不可能ですが、リフレクション と を使用すると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>
于 2011-04-23T20:54:51.183 に答える
0

バインディング マークアップ拡張機能に記述した内容は、既定でプロパティに割り当てられPathます。このプロパティは文字列であるため、内部で参照する動的コンテンツは評価されません。やろうとしていることを実行するための単純な XAML のみの方法はありません。

于 2011-04-23T20:25:11.950 に答える
0

これを使用しない理由:

<StackPanel>
        <ListBox Name="lsbItems" ItemsSource="{Binding Items}" SelectedIndex="{Binding Index}"/>
        <Label Content="{Binding ElementName=lsbItems, Path=SelectedItem}"/>
</StackPanel>
于 2011-04-25T07:05:27.457 に答える