在usercontrol

时间:2016-03-14 21:12:02

标签: c# data-binding win-universal-app

我正在使用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到一个文本框而不是列表视图的选定项目,它都是一种享受。它是一个自由形式的教科书,而不是从列表中选择,但所有绑定和管道工作都很好。那么关于使绑定行为以这种方式行事的列表框是什么呢?我该如何解决它呢?谢谢大家!

0 个答案:

没有答案