2017-03-23 3 views
2

2つのコレクションを表示する画面があります。 左側に、セクションのリストが表示されます。デフォルトでは、最初のセクションが選択されています。別のセクションをクリックすると、代わりにそのセクションが選択されます。 右側には、1対多の関係でそのセクションの関連する質問のリストがあります。テキストボックスのWin 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> 

私は別のViewModelにある選択されたセクションを更新するために、プリズムとEventAggregatorパターンを使用しています。 これは1つの重要な問題を除いて動作します。ページが読み込まれると、セクションを更新するだけです。現在、このイベントは、ページが読み込まれたときと回答が変更されたときの両方で発生します。 これを動作させて負荷を無視するにはどうすればよいですか?

答えて

2

は、私は、ページがロードされた後のセクションを更新したいです。現在このイベントは、ページが読み込まれたときと回答が変更されたときの両方で発生します。

私は、ページが上記

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

をロードされると更新をアクティブにするコマンドを定義したいWinRTの(またはUWPのNuGet package)上で動作するSDKを必要とし、代わりにあなたが扱うことができますLoadedイベントをコードビハインドで処理し、それをViewModelにも中継します。

ActivateCommandは、IfQuestionSetCheckIfAnsweredメソッドでテストできるように、ViewModelのメンバーをbool IsLoadedに設定することになっています。

+1

対話性:Interaction.BehaviorsはWinRTでサポートされていません – arame3333

+1

おそらくsdkが必要です。この[answer](https://social.msdn.microsoft.com/Forums/windowsserver/en-US/29c709d8-6ddb) -4e19-b8c2-6a035b1bcb41/uwpwill-が--行動-SDKツーサポート-eventtriggerbehavior-invokecommandactionこと?フォーラム= wpdevelop)... –

+2

それとも背後にあるコードで 'Loaded'イベントを処理し、イベントを中継ビューモデルに? –

関連する問題