我正在使用MVVM UWP构建一个问卷调查应用程序。所有问题都采用单个问题字符串的形式,以及两个或多个选项字符串,必须从中进行单一选择(例如,非常同意,同意等等。
我有一个用于保存问题数据的课程如下:
public class ScaleQuestion
{
public string Answer { get; set; }
public string Question { get; set; }
public string[] Options { get; set; }
public ScaleQuestion(string Question, string[] Options)
{
this.Question = Question;
this.Options = Options;
}
}
问卷只是一个问题清单:
class Questionnaire
{
public List<ScaleQuestion> Questions { get; set; }
public Questionnaire()
{
Questions = new List<ScaleQuestion>();
}
}
我有一个用户控件,带有一个文本块和一个选择列表视图,分别用于问题和可用选项,带有绑定以显示这些并检索所选项目。选择项绑定是双向的,因此当用户在问题中向后和向前导航时,可以重新显示答案:
<Grid>
<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding QuestionData.Question, ElementName=userControl}"/>
<ListView ItemsSource="{Binding QuestionData.Options, ElementName=userControl}" SelectedItem="{Binding QuestionData.Answer, ElementName=userControl, Mode=TwoWay}"/>
</Grid>
后面的用户控制代码具有依赖属性以允许绑定问题数据:
public ScaleQuestion QuestionData
{
get { return (ScaleQuestion)GetValue(QuestionDataProperty); }
set { SetValue(QuestionDataProperty, value); }
}
public static readonly DependencyProperty QuestionDataProperty = DependencyProperty.Register("QuestionData", typeof(ScaleQuestion), typeof(ScaleQuestionControl), null);
此后,我将一个usercontrol实例打到我的一个视图上,并将其QuestionData绑定到我的模型:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<UserControls:ScaleQuestionControl QuestionData="{Binding CurrentQuestion}"/>
<Button Content="Backwards" Command="{Binding BackwardsCommand}"/>
<Button Content="Forwards" Command="{Binding ForwardsCommand}"/>
</Grid>
在这种情况下,我的模型有一个类型为Questionnaire(问题列表)的成员,而CurrentQuestion绑定指向该列表中的项目。
一切都很好,到了一定程度 - 选项列表从绑定中填充,所选答案很好地绑定。当我通过在CurrentQuestion上引发NotifyPropertyChanged来进入下一个问题时,问题出现了。
这样做会触发selectitem绑定的刷新,这种绑定在某种程度上会丢失选择,因此我的所有选择基本上都会重置。
然而 - 如果我在QuestionData.Answer到一个文本框而不是列表视图的选定项目,它都是一种享受。它是一个自由形式的教科书,而不是从列表中选择,但所有绑定和管道工作都很好。那么关于使绑定行为以这种方式行事的列表框是什么呢?我该如何解决它呢?谢谢大家!