在我的ViewModel中,我有一个对象的集合,每个对象都包含另一个集合。我正在尝试使用嵌套的列表视图项模板在我的视图中显示它。以下是我的 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。我尝试过使用 {Binding OuterCollection.InnerCollection}
、{Binding DataContext.InnerCollection}
和 {Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}
进行内部绑定,但所有这些都会导致它崩溃。实现此嵌套绑定的正确方法是什么?
编辑:我应该补充一点,这是针对从Windows Phone 7移植的应用程序,并且试图找到LongListSelector
的替代品,这在WinRT中不可用。
我想出了解决方案!它需要结合我以前尝试的解决方案。嵌套列表视图中内部集合的正确绑定是:
{Binding RelativeSource={RelativeSource TemplatedParent},
Path=DataContext.InnerCollection}
此外,根据嵌套列表视图的用途,我发现最好对外部集合使用 ItemsView,对内部集合使用 ListView。否则,两个控件的可选性将相互重叠。