在Windows Phone 8上的列表框中绑定列表框

时间:2015-04-19 21:09:28

标签: windows-phone-8

我想在AnswerList中绑定QuestionList。当我运行代码时,屏幕上只有问题列表。

<ListBox x:Name="listques"  ItemsSource="{Binding QuestionList  }">
    <ListBox.ItemTemplate>
       <DataTemplate>
          <StackPanel>
             <TextBlock x:Name="quesdetail"  Text="{Binding QuestionContent.que_detail}" HorizontalAlignment="Left" Margin="27.669,34.338,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="252.564" Width="419.534" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" d:LayoutRounding="Auto">
       </TextBlock>
             <ListBox>
                <ListBox.ItemTemplate>
                   <DataTemplate>
                   <StackPanel>
                      <TextBlock x:Name="ansdetail" Foreground="Blue" Text="{Binding Answer.ans_detail}">
                       </TextBlock>
                   </StackPanel>
                   </DataTemplate>
                </ListBox.ItemTemplate>
             </ListBox>
          </StackPanel> 
       </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

3 个答案:

答案 0 :(得分:0)

您的Question对象中应该有一个属性AnswerList。将其指定为内部ListBox的itemsSource。因此,对于每个问题,您都会有一个答案列表。

<ListBox x:Name="InnerListBox" ItemsSource = "{Binding QuestionContent.AnswerList}">

答案 1 :(得分:0)

@Bells是对的。为了更详细地阐述他的答案,让我通过一个外部的例子来解释。

示例: -

        // MainPage.xaml page
        // eg. we have a nested ListBox for questions and answers

        <ListBox x:Name="lbxRoot">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding que}" FontSize="30" />
                        <ListBox ItemsSource="{Binding lstAns}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <TextBlock Text="{Binding}" Margin="20 0 0 0" FontSize="30"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

要将ItemsSource分配给RootListBox,请定义一个包含一个问题的模型类和该问题的答案列表。

// MainPage.xaml.cs file add one class named Model as below

public class Model
{
    public string que { get; set; }
    public List<string> lstAns { get; set; }
}

现在,我们将在页面的Loaded事件中将ItemsSource分配给根ListBox,因此在MainPage的构造函数中声明事件处理程序。

this.Loaded += MainPage_Loaded;

然后定义Loaded事件处理程序,如下所示。

    // MainPage.xaml.cs file 
    // Loaded event handler

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Model m1 = new Model()
        {
            que = "Question 1",
            lstAns = new List<string>()
            {
                "que 1 - ans 1", "que 1 - ans 2", "que 1 - ans 3"
            }
        };

        Model m2 = new Model()
        {
            que = "Question 2",
            lstAns = new List<string>()
            {
                "que 2 - ans 1", "que 2 - ans 2", "que 3 - ans 3"
            }
        };

        List<Model> lstModels = new List<Model>();
        lstModels.Add(m1);
        lstModels.Add(m2);

        lbxRoot.ItemsSource = lstModels;
    }

它将提供如下图像的输出:

Output ScreenShot

然后你去...... !!

尝试将您的方案与此示例相关联,并且您已完成..!

希望有所帮助..

答案 2 :(得分:0)

ListBoxItem将尝试在ItemSource中其当前项目的属性内查找绑定。因此,第一个ListBox将尝试在其ItemSource上查找属性,而内部ListBox将尝试在其ItemSource上查找其绑定。

如果要绑定内部ListBox的ListBoxItem,则必须指定relativeSource(为了清楚起见,prop1表示属性,无论是哪个属性):

 <ListBox ItemSource="{Binding list1}"
        <ListBox.ItemTemplate>
           <DataTemplate>
               <StackPanel>
                   <TextBlock Text="{Binding propList1}"/>

                        <ListBox ItemsSource="{Binding list2}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                       <TextBlock Text="{Binding DataContext.propList1, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>

                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
    </ListBox>

此行

<TextBlock Text="{Binding DataContext.propList1, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/>

wpf将在其视觉树中查找类型为ListBox的父级,并使用其DataContext,其DataContext是外部ListBox的ListBoxItem。