简体   繁体   English

ListView绑定到列表中的列表

[英]ListView bind to List inside List

I'm building a School App that can display your grades. 我正在构建一个可以显示您的成绩的School App。 I have the following DataStructure: 我有以下DataStructure:

public class Rootobject
{
    public List<Subject> subjects{ get; set; }
}

public class Subject
{
    public String name { get; set; }
    public int id { get; set; }
    public String teacher { get; set; }
    public GradeSet wirtten { get; set; }
    public GradeSet spoken { get; set; }
    public float average { get; set; }
}

public class GradeSet
{
    public float counts { get; set; }
    public List<Grade> grades { get; set; }
    public float average { get; set; }
}

public class Grade
{
    public string name { get; set; }
    public string grade { get; set; }
}

I have an ObservableCollection from the type of "Subject" 我有一个来自“主题”类型的ObservableCollection

subjects = new ObservableCollection<Subject>();

I have 3 ListViews. 我有3个ListViews。 One shows all the Subjects (name & teacher). 一个显示所有主题(名称和老师)。 That works already. 那已经起作用了。 How I bound it: 我如何绑定它:

<ListView Name="SubjectsListView" IsItemClickEnabled="True" ItemsSource="{x:Bind subjects}" ItemClick="FacherListView_ItemClick">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Subject">
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{x:Bind name}" FontSize="20" Margin="4,0,0,0" />
                <TextBlock Text="{x:Bind teacher}" Grid.Row="1" Margin="4,4,0,0" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

In the other 2 ListViews, in the first, I want to display the written grades (name & the grade itself), in the second, I want to display the spoken grades (name & the grade itself). 在其他两个ListView中,第一个,我要显示书面成绩(名称和成绩本身),第二个,我要显示口语成绩(名称和成绩本身)。 The written and spoken grades ListView look the same, but how do I bind the grades and names to them? ListView的书面和口语成绩看起来相同,但是如何将成绩和名称绑定到它们? This is the ListView: 这是ListView:

<ListView Name="gradeView" Grid.Column="0" HorizontalContentAlignment="Stretch" Grid.Row="2" SelectionMode="None">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <StackPanel Orientation="Vertical">
                    <TextBlock Name="GradeName" Text="The name of the grade"  FontSize="20" FontWeight="Bold" />
                    <TextBlock Name="GradeName" Text="the grade (B+)" FontSize="20" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Since there is a written and spoken grade per subject you could bind the ItemsSource property of the "gradeView" to the SelectedItem property of the "SubjectsListView": 由于每个科目都有书面和口语成绩,因此您可以将“ gradeView”的ItemsSource属性绑定到“ SubjectsListView”的SelectedItem属性:

<ListView Name="gradeView" Grid.Column="0" HorizontalContentAlignment="Stretch" Grid.Row="2" SelectionMode="None"
                  ItemsSource="{Binding SelectedItem.wirtten.grades, ElementName=SubjectsListView}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Grade">
            <Grid Margin="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <StackPanel Orientation="Vertical">
                    <TextBlock Name="GradeName" Text="{x:Bind name}"  FontSize="20" FontWeight="Bold" />
                    <TextBlock Name="GradeName" Text="{x:Bind grade}" FontSize="20" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

It is almost the same for the third ListView . 第三个ListView几乎相同。 Just change the path of the ItemsSource binding: 只需更改ItemsSource绑定的路径即可:

<ListView Name="gradeView2" Grid.Column="0" HorizontalContentAlignment="Stretch" Grid.Row="2" SelectionMode="None"
                  ItemsSource="{Binding SelectedItem.spoken.grades, ElementName=SubjectsListView}">

The second and third ListView s should then be populated as you select a corresponding subject in the first ListView . 第二和第三ListView为您选择了第一的相应主体s然后应该填充ListView

This is untested, but you might try adding a nested ListView to display the grades, like this: 这未经测试,但是您可以尝试添加嵌套的ListView来显示成绩,如下所示:

<ListView Name="SubjectsListView"
          IsItemClickEnabled="True"
          ItemsSource="{x:Bind subjects}"
          ItemClick="FacherListView_ItemClick">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Subject">
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{x:Bind name}"
                           FontSize="20"
                           Margin="4,0,0,0" />


                <ListView IsItemClickEnabled="True"
                          ItemsSource="{x:Bind wirtten.grades}"
                          Grid.Row="1"
                          Margin="4,4,0,0">
                    <ListView.ItemTemplate>
                        <DataTemplate x:DataType="data:Grade">
                            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <TextBlock Text="{x:Bind name}"
                                           FontSize="20"
                                           Margin="4,0,0,0" />
                                <TextBlock Text="{x:Bind grade}"
                                           Grid.Row="1"
                                           Margin="4,4,0,0" />
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>



            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM