如何在Metro/WinRT中绑定嵌套的ListView ItemTemplates数据?

jok*_*efe 7 c# data-binding microsoft-metro windows-runtime winrt-xaml

在我的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;
}
Run Code Online (Sandbox Code Playgroud)

以下是我在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>
Run Code Online (Sandbox Code Playgroud)

如果我删除内部ListView,外部ListView绑定完全正常.我只是无法弄清楚如何将内部集合对象正确绑定到内部ListView.我已经尝试用{Binding OuterCollection.InnerCollection},{Binding DataContext.InnerCollection}{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection},做内部绑定,但所有这些导致它崩溃.实现此嵌套绑定的正确方法是什么?

编辑:我应该补充一点,这是一个从Windows Phone 7移植的应用程序,它是一个尝试找到替代品LongListSelector,这在WinRT中不可用.

jok*_*efe 8

我想出了解决方案!它需要我以前尝试过的解决方案的组合.嵌套ListView中内部集合的正确绑定是:

{Binding RelativeSource={RelativeSource TemplatedParent},
                         Path=DataContext.InnerCollection}
Run Code Online (Sandbox Code Playgroud)

此外,根据您对嵌套ListView的目的,我发现最好使用ItemsView作为外部集合,使用ListView作为内部集合.否则,两个控件的可选择性相互重叠.