2016-09-16 2 views
0

Я пытаюсь создать приложение Windows 10, чтобы предлагать список вопросов; каждый вопрос отображает текст вопроса (TextBlock) и список возможных ответов (ListView указывает на DataTemplate, состоящий из ToggleButton).UWP ListView в ListView не соответствует INotifyPropertyChanged

Программа запускается, и каждый ответ/Возможный ответ отображается, насколько это хорошо. Теперь я хочу ограничить каждый вопрос одним ответом, а это значит, что когда один флажок «Ответчик (ToggleButton)» отмечен, остальные для этого вопроса должны быть сняты. Проблема в том, что этого не происходит, несмотря на то, что я внедрил INotifyPropertyChanged в классе ProbAnswer и вызвал соответствующий метод. Я даже реализовал это для класса «Ответ» в надежде, что это поможет, но это не так.

Я делаю что-то явно немое? Любая помощь будет принята с благодарностью.

Примечание: Я использую ToggleButtons, потому что проверка RadioButton в одном вопросе будет отменять RadioButtons во всех других вопросах.

Мой XAML файл: (A ListView [Для каждого вопроса], указывающие на DataTemplate, состоящей из TextBlock (Вопрос текст) и ListView [PossibleAnswers])

<Page x:Class="QuestionsnAnswers.MainPage" ... > 
    <Page.Resources> 
     <DataTemplate x:Key="myAnswersTemplate" x:DataType="local:Answer"> 
      <RelativePanel> 
       <TextBlock Text="{Binding QuestionText}"/> 
       <ListView Margin="0, 20 ,0 ,0" 
          ItemsSource="{Binding PossibleAnswers}" 
          ItemTemplate="{StaticResource myPossibleAnswersTemplate}"> 
       </ListView> 
      </RelativePanel> 
     </DataTemplate> 

     <DataTemplate x:Key="myPossibleAnswersTemplate" x:DataType="local:PossibleAnswer"> 
      <ToggleButton Content="{Binding PossibleAnswerText}" IsChecked="{Binding IsChecked}" Click="PossibleAnswerClicked" /> 
     </DataTemplate> 
    </Page.Resources> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ListView Name="uiQuestionsnAnswers" ItemTemplate="{StaticResource myAnswersTemplate}"/> 
    </Grid> 
</Page> 

Мой MainPage файл: (На одной странице показать список ответов каждый со списком PossibleAnswers)

public sealed partial class MainPage : Page 
{ 
    ObservableCollection<Answer> Answers = new ObservableCollection<Answer>(); 

    public MainPage() 
    { 
     this.InitializeComponent(); 

     //populate example answers 
     Answers.Add(new Answer { AnswerId = 1, QuestionText = "Question 1" }); 
     Answers.Add(new Answer { AnswerId = 2, QuestionText = "Question 2" }); 
     Answers.Add(new Answer { AnswerId = 3, QuestionText = "Question 3" }); 
     uiQuestionsnAnswers.ItemsSource = Answers; 
    } 

    private void PossibleAnswerClicked(object sender, RoutedEventArgs e) { 
     //get the reference to this togglebutton's PossibleAnswer and update the model. 
     ListViewItemPresenter parent = VisualTreeHelper.GetParent(sender as DependencyObject) as ListViewItemPresenter; 
     PossibleAnswer possAnswer = parent.Content as PossibleAnswer; 
     possAnswer.IsChecked = true; 
    } 
} 


class Answer : INotifyPropertyChanged { 
    public int AnswerId { get; set; } 
    public string QuestionText { get; set; } 
    public ICollection<PossibleAnswer> PossibleAnswers { get; set; } 
    public int ChosenPossibleAnswerId { get; set; } 

    public Answer() { 
     PossibleAnswers = new List<PossibleAnswer>(); 
     PossibleAnswers.Add(new PossibleAnswer { ThisAnswer = this, PossibleAnswerId = 1, PossibleAnswerText = "yes" }); 
     PossibleAnswers.Add(new PossibleAnswer { ThisAnswer = this, PossibleAnswerId = 2, PossibleAnswerText = "no" }); 
     PossibleAnswers.Add(new PossibleAnswer { ThisAnswer = this, PossibleAnswerId = 3, PossibleAnswerText = "I don't know" }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(String propertyName = "") { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    internal void setChosenAnswer(int possibleAnswerId) { 
     //record this possibleAnswer as the answer to this question. 
     ChosenPossibleAnswerId = possibleAnswerId; 

     foreach (PossibleAnswer possAnswer in PossibleAnswers) { 
      if (possAnswer.PossibleAnswerId != ChosenPossibleAnswerId) { 
       possAnswer.IsChecked = false; 
       Debug.WriteLine("Answer " + AnswerId + " has unchecked possible answer " + possAnswer.PossibleAnswerId); 
      } 
     } 
     NotifyPropertyChanged(); 
    } 
} 


class PossibleAnswer : INotifyPropertyChanged { 
    public Answer ThisAnswer { get; set; } 
    public int PossibleAnswerId { get; set; } 
    public string PossibleAnswerText { get; set; } 

    private bool _IsChecked = false; 
    public bool IsChecked { 
     get { 
      return _IsChecked; 
     } 
     set { 
      _IsChecked = value; 
      if (value == true) { 
       ThisAnswer.setChosenAnswer(PossibleAnswerId); 
      } 
      else { 
       NotifyPropertyChanged("IsChecked"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(String propertyName = "") { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

ответ

1

чтобы устранить эту проблему, мы можем установить Binding Mode из IsChecked в TwoWay как следующее:

<ToggleButton Click="PossibleAnswerClicked" Content="{Binding PossibleAnswerText}" IsChecked="{Binding IsChecked, Mode=TwoWay}" /> 

Для {Binding} markup extension в большинстве случаев режим по умолчанию является односторонним. И он хорошо работает для данных только для чтения. Если мы хотим, чтобы изменения, которые пользователь делает для значений в пользовательском интерфейсе, автоматически отбрасываются обратно в источник данных, нам нужно использовать двустороннюю привязку, и это хорошо работает для чтения-записи данных. Если мы используем одностороннюю привязку здесь, привязка потеряет эффект после того, как пользователь щелкнет ToggleButton, поэтому ваш код не будет работать.

+0

Это сработало отлично! Спасибо. – user328414