为TextBox赢取Rt更改事件

时间:2017-03-23 10:21:21

标签: c# winrt-xaml prism

我有一个显示2个收藏的屏幕。 在左侧,我显示了一个部分列表。默认情况下,选择第一部分。如果您单击另一个部分,则会被选中。 在右侧,我在一对多关系中列出了该部分的相关问题。

所以每个问题属于一个部分,一个部分可以有一到多个问题。

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

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

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

下面的代码显示了QuestionViewModel(其中包含了answer属性),而XAML代码位于DataTemplate中,所以我认为Visual Tree没有一种方法可以更新该部分。

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

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中的Selected Section。 现在除了一个重要的问题外,这个工作。我只想在页面加载后更新该部分。目前,在加载页面和答案更改时都会触发此事件。 如何让它工作,以便忽略负载?

1 个答案:

答案 0 :(得分:2)

  

我只想在页面加载后更新该部分。目前,在加载页面和答案更改时都会触发此事件。

我定义了一个在加载页面后激活更新的命令

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

以上需要WinRT上的Behavior SDK(或UWP上的NuGet package),或者您可以在代码后面处理Loaded事件并将其转发到ViewModel。

然后ActivateCommand应该设置ViewModel的bool IsLoaded成员,以便可以在IfQuestionSetCheckIfAnswered方法中对其进行测试。