Я пытаюсь создать приложение 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));
}
}
}
Это сработало отлично! Спасибо. – user328414