请不要担心问题的长度,这是一个非常简单的案例,但我花了两天时间到现在,我不知道为什么绑定不起作用。我有一个窗口可以进行测验,因此我创建了包含问题列表的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?
我做错了什么阻止了答案的选择?
答案 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;
}