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

7

在我的ViewModel中,我有一个包含另一个集合的对象集合。我尝试通过使用嵌套的ListView ItemTemplates在我的View中显示它。这是我的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迁移过来的应用程序,并且是为了寻找取代WinRT中不可用的LongListSelector的替代方案。
1个回答

8

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

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

另外,根据嵌套的ListView使用目的不同,我发现更好的做法是使用ItemsView作为外部集合,而将内部集合使用ListView。这样可以避免两个控件之间的可选性互相重叠。


这对我有用!我疯狂地试图弄清楚它。有一个问题——你是否必须将{Binding InnerTitle}更改为其他内容?我看到所有的ListView元素都正确创建了,但{Binding InnerTitle}不起作用。 - Weston
没关系 - 我的问题在于我没有意识到 public string Name; 不会绑定,而 public string Name { get; set; } 会。 - Weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接