在WPF中绑定ListBox SelectedItem

时间:2018-05-09 11:38:14

标签: wpf data-binding

请不要担心问题的长度,这是一个非常简单的案例,但我花了两天时间到现在,我不知道为什么绑定不起作用。我有一个窗口可以进行测验,因此我创建了包含问题列表的QuestionsListBox,用于显示所选问题文本的QuestionTextBlock和用于显示答案选项的AnswersListBox。如果问题有预先选择的答案,AnswersListBox必须相应地加载答​​案并选择所选答案。

在后面的窗口代码中我创建了一个依赖属性来加载考试题:

public static DependencyProperty QuestionsProperty = DependencyProperty.Register("Questions", typeof(List<Models.Questions>), typeof(Question));
public List<Models.Question> Questions
{
    get { return (List<Models.Question>)GetValue(QuestionsProperty); }
    set { SetValue(QuestionsProperty, value); }
}

模型是:

public class Question
{
    public short QuestionNo { get; set; }
    public byte[] QuestionImage { get; set; }
    public string QuestionText { get; set; }
    public Answer SelectedAnswer { get; set; }
    public List<Answer> Answers { get; set; }
}
public class Answer
{
    public short AnswerID { get; set; }
    public short AnswerPower { get; set; }
    public string AnswerText { get; set; }
}

在xaml中,我有如下配置:

<ListView x:Name="QuestionList"
      ItemsSource="{Binding ElementName=Questionctl, Path=Questions}">
    <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type model:Question}">
            <Grid>
                <TextBlock Text="{Binding Question.QuestionNo}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

<TextBlock x:Name="lblText"
            Text="{Binding ElementName=QuestionList, Path=SelectedItem.QuestionText}">
</TextBlock>

<ListBox x:Name="AnswersListBox"
         ItemsSource="{Binding ElementName=QuestionList, Path=SelectedItem.Answers}"
         SelectedItem="{Binding ElementName=QuestionList, Path=SelectedItem.SelectedAnswer, Mode=TwoWay}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type model:Answer}">
            <Grid>
                <TextBlock Text="{Binding AnswerText}">
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

当我加载问题并选择任何问题时,一切都正确加载。问题的文本,答案列表,除非问题有预先选择的答案,答案未在答案列表中选择。但如果我选择答案,模型会立即更新。如果答案列表是基于绑定更新的,那么为什么不选择Answers?

我做错了什么阻止了答案的选择?

1 个答案:

答案 0 :(得分:0)

我找出原因,所以万一有人面临同样的问题,他可以节省调试和尝试的时间......

简短的回答是:问题在于填充数据源而不是绑定。

我正在使用JSON格式的网络服务填写考试数据源,在这种情况下,即使选定的答案与答案列表之一具有相同的值,当它到达客户端时,选择的答案不会被视为答案之一。相反,它将被视为具有相同数据的新答案类。

为了纠正这个问题,我没有触摸我的xaml,因为它没有任何错误。相反,我从webservice填充后循环遍历列表,将所选答案重新设置为可用答案之一:

private List<Models.Question> RectifyQuestions(List<Models.Question> exam)
{
    foreach(var item in exam)
    {
        if (item.SelectedAnswer != null)
        {
            item.SelectedAnswer = item.Answers.FirstOrDefault(a => a.AnswerID == item.SelectedAnswer.AnswerID);
        }
    }
    return exam;
}