2016-08-22 8 views
1

私のコントロールには2つの依存関係プロパティがあります。両方とも異なるタイプのIReadOnlyListに結合します。ロードするWPF依存関係プロパティの待機

#region QuestionsProperty 
public static readonly DependencyProperty QuestionsProperty = 
    DependencyProperty.Register("Questions", typeof(IReadOnlyList<IQuestion>), typeof(DecisionsControl), new FrameworkPropertyMetadata(OnQuestionsChanged)); 

public IReadOnlyList<IQuestion> Questions 
{ 
    get { return (IReadOnlyList<IQuestion>)GetValue(QuestionsProperty); } 
    set { SetValue(QuestionsProperty, value); } 
} 

private static void OnQuestionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    DecisionsControl control = d as DecisionsControl; 
    control?.OnQuestionsChanged((IReadOnlyList<IQuestion>)e.OldValue, (IReadOnlyList<IQuestion>)e.NewValue); 
} 

public void OnQuestionsChanged(IReadOnlyList<IQuestion> oldValue, IReadOnlyList<IQuestion> newValue) 
{ 
    // Both lists needed here 
} 
#endregion 

#region AnswersProperty 
public static readonly DependencyProperty AnswersProperty = 
    DependencyProperty.Register("Answers", typeof(IReadOnlyList<IAnswer>), typeof(DecisionsControl), new FrameworkPropertyMetadata(OnAnswersChanged)); 

public IReadOnlyList<IAnswer> Answers 
{ 
    get { return (IReadOnlyList<IAnswer>)GetValue(AnswersProperty); } 
    set { SetValue(AnswersProperty, value); } 
} 

private static void OnAnswersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    DecisionsControl control = d as DecisionsControl; 
    control?.OnAnswersChanged((IReadOnlyList<IAnswer>)e.OldValue, (IReadOnlyList<IAnswer>)e.NewValue); 
} 

public void OnAnswersChanged(IReadOnlyList<IAnswer> oldValue, IReadOnlyList<IAnswer> newValue) 
{ 
    // Both lists needed here 
} 
#endregion 

コントロールでは、コンテンツを正しく表示するためには両方のリストが必要です。 ViewModelの作成者は、両方のプロパティを自由に読み込むことができるので、最初に利用可能なリストがわからないでしょう。

私は両方のリストが利用可能になるのを待つ方法を探しています。 CoreceValueメソッドは、Dependency PropertyがViewModelから新しい値をロードするように強制することができないため、役に立たないと思いますか?

ViewModelで2つのリストをマージすることは、ビュー関連のタスクであるためオプションではありません。

答えて

2

これは正しくありません。バインディングは確定的方法ので解決されます。 MVVM Patternを使用している場合は、DataContextChangedイベントに接続してViewModelがViewに設定され、ViewModelOnPropertyChangedにコールされた瞬間にOnValueChangedコールバックが呼び出されたことを確認する必要があります。あなたのViewModelで

、あなたはコールバックが発射されたときに知っていて、そこにあなたのUIロジックを行うだろうようにAnswersOnPropertyChangedを呼び出して明示的にQuestionsAnswersを設定したいと思います。

+0

私は「ユーザーが2つのプロパティを自由に変更できる」という意味で「決定論的」と考えました。だから私は、どのプロパティが最初に適用されるかは関係のない方法でコントロールを設計する必要があります。私はそれに応じて私の質問を編集します。 –

+1

あなたは、「ユーザーが2つのプロパティを自由に変更できる」と言っているときに、ロジックが正しくないように見えるので、設計をやり直して再度考えてみる必要があります。彼らが最初に答えを変えてから質問をしたらどうなるでしょう?あなたは答えのコールバックでのみそれを処理しています。なぜあなたは同時に2つのリストを必要としますか?あなたは何をしようとしているのですか? ViewModel上にないのですか?これは本当にあなたがやるUIロジックですか? –

関連する問題