2017-03-23 74 views
2

我有一个显示2个集合的屏幕。 在左侧显示部分列表。默认情况下,第一部分被选中。如果你点击另一个部分,那么就会选择它。 在右侧,我在一对多关系中列出了该部分的相关问题。赢得文本框Rt更改事件

因此,每个问题属于一个部分,一个部分可以有1到很多问题。

有些问题需要有答案,有些可以选择回答。 为了方便用户查找所需的问题,答案文本框旁会显示一个红色星号。当这个问题得到回答时,它就消失了。

此外,我需要显示每个部分有未解答的问题的星号。一旦他们全部回答,该部分的星号也会消失。

可视化树是这种格式; SurveyPageViewModel - SurveyViewModel - SectionViewModel - QuestionViewModel

下面的代码显示(其中包含了答案属性)的QuestionViewModel和XAML代码是在一个DataTemplate,所以我不认为有一种方式了可视化树更新部分。

所以我的(简化的)我的答案属性的处理程序代码看起来像这样;

private string _answer; 
public string Answer 
{ 
    get 
    { 
     return _answer; 
    } 
    set 
    { 
     if (SetProperty(ref _answer, value)) 
     { 
      this.IfQuestionSetCheckIfAnswered(this.IsRequiredOnScreenAnswer); 
     } 
    } 
} 

private void IfQuestionSetCheckIfAnswered(bool value) 
{ 
    if (this.IsRequired && string.IsNullOrWhiteSpace(this.Text) == false) 
    { 
     this.EventAgg.GetEvent<RequiredAnswerUpdatedEvent>().Publish(value); 
    } 
} 

和我的XAML的问题/答案;

<StackPanel Orientation="Horizontal" Grid.Row="1" Grid.ColumnSpan="2" Grid.Column="0" Margin="0, 0, 0, 5"> 
       <TextBox Grid.Row="1" 
         Text="{Binding Path=Answer, Mode=TwoWay}" 
         MinWidth="300" 
         IsReadOnly="{Binding Path=IsReadOnly}" /> 
       <TextBlock Text="*" FontSize="40" FontWeight="Bold" 
        Style="{StaticResource ResourceKey=RequiredSignal}" Margin="5, 0, 0, 0" 
        Visibility="{Binding Path=IsRequiredOnScreenAnswer, Converter={StaticResource ResourceKey=BooleanToVisibilityConverter}}" /> 
      </StackPanel> 

我正在使用Prism和EventAggregator模式来更新在不同的ViewModel中选定的部分。 现在这个工程除了一个重要的问题。我只想在页面加载后更新该部分。目前,这个事件在页面加载时和答案改变时都被触发。 我如何得到这个工作,所以负载被忽略?

回答

2

我只想在页面加载后更新该部分。目前这个事件在页面加载和答案改变时都被触发。

我会定义一个命令激活一次更新的页面加载

<interactivity:Interaction.Behaviors> 
    <core:EventTriggerBehavior EventName="Loaded"> 
     <core:InvokeCommandAction Command="{Binding ActivateCommand}" /> 
    </core:EventTriggerBehavior> 
</interactivity:Interaction.Behaviors> 

上述要求对WinRT的行为SDK(或UWP的的NuGet package),或者你可以处理代码后面的Loaded事件,并将其中继到ViewModel。

然后ActivateCommand应该设置一个bool IsLoaded ViewModel的成员,以便它可以在您的IfQuestionSetCheckIfAnswered方法中测试。

+1

交互性:Interaction.Behaviors在WinRT中不受支持 – arame3333

+1

也许需要sdk,看看这个例子[answer](https://social.msdn.microsoft.com/Forums/windowsserver/en-US/29c709d8-6ddb -4e19-b8c2-6a035b1bcb41/uwpwill-there-be-a-behavior-sdk-to-support-eventtriggerbehavior-invokecommandaction?forum = wpdevelop)... –

+2

或者只是在后面的代码中处理'Loaded'事件并转发事件到视图模型? –