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},但所有这些都会导致它崩溃。实现这种嵌套绑定的正确方法是什么?

编辑:我应该补充一点,这是从 Windows Phone 7 移植的应用程序,它试图找到LongListSelectorWinRT 中不可用的替代品。

4

1 回答 1

8

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

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

此外,根据嵌套 ListViews 的用途,我发现最好将 ItemsView 用于外部集合,将 ListView 用于内部集合。否则,两个控件的可选择性会相互重叠。

于 2012-07-16T19:28:52.797 回答