7

私のViewModelには、それぞれが別のコレクションを含むオブジェクトのコレクションがあります。ネストされた ListView ItemTemplates を使用して、ビューにこれを表示しようとしています。これが私のViewModelコードの簡略化です:

public ViewModelObject
{
    public ObservableCollection<OuterObject> OuterCollection { get; }
}

public OuterObject
{
    public string OuterTitle;
    public ObservableCollection<InnerObject> InnerCollection { get; }
}

public InnerObject
{
    public string InnerTitle;
}

そして、これは、XAML でこの ViewModel を使用しようとしている方法を簡略化したものです。

<ListView ItemsSource="{Binding OuterCollection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding OuterTitle}"/>
                <ListView ItemsSource="{Binding InnerCollection}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding InnerTitle}"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

内側の ListView を削除すると、外側の ListView バインディングは完全に正常に機能します。内部コレクション オブジェクトを内部 ListView に適切にバインドする方法がわかりません。{Binding OuterCollection.InnerCollection}{Binding DataContext.InnerCollection}、およびで内部バインディングを実行しようとしました{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}が、これらすべてが原因でクラッシュします。このネストされたバインディングを実現する適切な方法は何ですか?

編集:LongListSelectorこれは Windows Phone 7 から移植されたアプリケーション用であり、WinRT では利用できないの代替を見つける試みであることを付け加えておく必要があります。

4

1 に答える 1

8

解決策を思いつきました!以前に試みたソリューションの組み合わせが必要でした。ネストされた ListView の内部コレクションの正しいバインドは次のとおりです。

{Binding RelativeSource={RelativeSource TemplatedParent},
                         Path=DataContext.InnerCollection}

また、ネストされた ListView の目的によっては、外側のコレクションに ItemsView を使用し、内側のコレクションに ListView を使用する方がよいことがわかりました。そうしないと、2 つのコントロールの選択可能性が互いに重複します。

于 2012-07-16T19:28:52.797 に答える