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

时间:2012-07-13 22:35:18

标签: 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;
}

以下是我在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移植的应用程序,并且尝试查找LongListSelector的替代品,这在WinRT中不可用

1 个答案:

答案 0 :(得分:8)

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

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

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