привязка ListBox SelectedItem в WPF - PullRequest
0 голосов
/ 09 мая 2018

Пожалуйста, не беспокойтесь о длине вопроса, это очень простой случай, но я потратил два дня до сих пор, и я не знаю, почему не работает связывание. У меня есть окно для проведения викторины, поэтому я создал QuestionsListBox, в котором содержится список вопросов, QuestionTextBlock для отображения выбранного текста вопроса и AnswerersListBox для отображения параметров ответов. если у вопроса есть предварительно выбранный ответ, соответственно ответчикListBox должен загрузить ответы и выбрать выбранный ответ.

в коде окна я создал свойство зависимостей для загрузки вопросов экзамена:

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>

когда я загружаю вопросы и выбираю любой вопрос, все загружается правильно. текст вопроса, список ответов, за исключением случаев, когда вопрос имеет предварительно выбранный ответ, этот ответ не выбран в списке ответов. , но если я выбираю ответ, модель немедленно обновляется. если список ответов обновляется на основе привязки, то почему бы не для выбранных ответов?

Я сделал что-то не так, что помешало выбору ответа?

1 Ответ

0 голосов
/ 09 мая 2018

Я выяснил причину, поэтому, если кто-то сталкивается с той же проблемой, он может сэкономить время при отладке и попытке ...

краткий ответ: проблема в заполнении источника данных, а не в связывании.

Я заполняю источник данных экзамена, используя веб-сервис в формате JSON, и в этом случае даже выбранный ответ имеет те же значения, что и один из списка ответов, когда он достигает клиента, выбранный ответ НЕ будет рассматриваться как один из ответов . вместо этого он будет рассматриваться как класс новый ответ с такими же данными.

чтобы исправить проблему, я не трогал свой xaml, потому что в этом нет ничего плохого. Вместо этого я перебираю список после того, как он был заполнен веб-сервисом, чтобы переустановить выбранный ответ как один из доступных ответов:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...