c# - 赢得 TextBox 的 Rt 更改事件

标签 c# winrt-xaml prism

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

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

最佳答案

I only want to update the section once the page is loaded. Currently this event is fired both when the page is loaded AND when the answer changes.

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

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

上述内容需要 WinRT 上的 Behaviour SDK(或 UWP 上的 NuGet package),或者您也可以在后面的代码中处理 Loaded 事件并将其中继到 ViewModel。

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

关于c# - 赢得 TextBox 的 Rt 更改事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42973236/

相关文章:

c# - "Catastrophic failure"on MapControl tap with Windows Phone 10 SDK

c# - 如何在 Prism IContainerRegistry 中为 2 个接口(interface)注册相同的实例(=单例)

c# - 具有事件的复合 WPF GUI 界面

c# - 如何在 C# 应用程序中集成 d3.js 图表?

c# - 实体类型 ‘Business_attrib2object’ 具有使用数据注释定义的复合主键。要设置复合主键,请使用 Fluent API

c# - 与 WCF 通信的 Android 应用程序

c# - windows phone 8.1 swype 键盘事件捕获

windows-8 - 如何在 Windows 8 Metro 应用程序 C# 中将保存缩略图图像存储在设备中

arrays - 解析 Unity (Prism) 容器中的数组类型

c# - 无法让 SAFEARRAY 与 Interop 一起工作