好几天以来,我一直在努力寻找解决方案,这似乎很容易,但是我一直无法使它工作。
我有一个包含其自身集合的对象:
public class Car: ViewModelBase
{
private string _name;
public string Name { get { return _name; } set { Set(ref _name, value); } }
private ObservableCollection<Car> _carCollection = new ObservableCollection<Car>();
public ObservableCollection<Car> CarCollection { get { return _carCollection; } set { Set(ref _carCollection, value); } }
}
在我的ViewModel中,我定义了一个对象实例:
public class RecipesViewModel:ViewModelBase
{
private Car _car;
public Car Car { get { return _car; } set { Set(ref _car, value); } }
//User populates the name prop and the list within car (level 1 data),
//and adds a number of objects to the list within the level 1 list (level 2 data)
}
在视图/ XAML中,我使用Itemtemplate和数据源设置了一个列表:
<Page
x:Class="CarProject.Views.CarPage"
DataContext="{Binding CarViewModel, Source={StaticResource Locator}}"
...
mc:Ignorable="d">
<Page.Resources>
<ResourceDictionary>
<CollectionViewSource Source="{x:Bind ViewModel.Car.CarCollection, Mode=OneWay}"
x:Key="CarListSource"
IsSourceGrouped="False"/>
</ResourceDictionary>
</Page.Resources>
<Grid>
<ListView x:Name="CarList"
ItemsSource ="{Binding Source={StaticResource RecipeSingleAromaListSource}, Mode=OneWay}" >
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Car" x:Name="CarItem" >
<StackPanel>
<TextBlock Text="{x:Bind Name}"/>
<ListView x:Name="Level2Sublist"
ItemsSource="{Binding CarCollection"}>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
我已经尝试了“ Level2SubList”的RelativeSource和ItemsSource定义的许多排列,但是我似乎无法引用level2汽车集合。 无论我做什么,“ Level2SubList”都保持空白。
我一直在网上搜索,还没有找到类似的用例。也许我需要使用Google上一课,因为我不是唯一尝试过此方法的人:)
谢谢!
P.S。 该类和XAML列表包含许多其他属性,出于可读性考虑,我对其进行了简化
答案 0 :(得分:0)
内部DataTemplate
没有x:DataType
属性,如果您使用的是x:Bind
,则必须使用该属性:
<DataTemplate x:DataType="models:Car">
...
</DataTemplate>
然后,要实际显示汽车的Name
,您正在使用Name
的{{1}}属性,但这实际上设置了XAML名称。您需要TextBlock
属性:
Text
除了这些问题外,代码还对我有用。在空白的UWP项目(我的名字是<TextBlock Text="{x:Bind Name}" />
)中尝试以下操作:
MainPage.xaml
App3
MainPage.xaml.cs
<Page
x:Class="App3.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App3"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<ListView x:Name="CarList"
ItemsSource="{x:Bind Car.CarCollection}" >
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Car" x:Name="CarItem" >
<StackPanel>
<TextBlock Text="{x:Bind Name}"/>
<ListView x:Name="Level2Sublist"
ItemsSource="{Binding CarCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>
您可以看到该应用程序甚至显示了嵌套列表: