如何使用递归对象作为主要数据源,在列表视图中设置列表视图的ItemsSource?

时间:2018-10-11 08:23:23

标签: uwp uwp-xaml

由一个善良的灵魂解决,他使我意识到我需要进行更多的调试。我在这里提出的代码确实有效。

好几天以来,我一直在努力寻找解决方案,这似乎很容易,但是我一直无法使它工作。

我有一个包含其自身集合的对象:

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列表包含许多其他属性,出于可读性考虑,我对其进行了简化

1 个答案:

答案 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>

您可以看到该应用程序甚至显示了嵌套列表:

App