2016-08-22 76 views
1

我在我的控制中有兩個依賴屬性。兩者都綁定到不同類型的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方法不會幫助,因爲它不能強制依賴屬性從ViewModel中加載一個新的值?

合併ViewModel中的兩個列表不是一個選項,因爲這是一個與視圖相關的任務。

回答

2

這是不正確的。綁定以確定性方式解決。如果您使用的是MVVM模式,那麼您應該可以將它連接到DataContextChanged事件上,以確保ViewModel現在設置爲View,而您的ViewModel呼叫OnPropertyChanged那麼此時調用OnValueChanged回撥。

在您的視圖模型,你想設置QuestionsAnswers然後明確地對Answers調用OnPropertyChanged,這樣,當回調被觸發,你會知道,做你的UI邏輯存在。

+0

我以「用戶可以隨意更改這兩個屬性」的方式思考「確定性」。所以我需要設計自己的控制方式,首先應用哪個屬性無關緊要。我會相應地編輯我的問題。 –

+1

你必須退後一步,再次思考你的設計,而不是將它與對方相連,因爲如果你說「用戶可以隨意更改兩個屬性」,那麼你的邏輯看起來不正確。如果他們先改變答案然後問題會發生什麼?您只能在答案回調中處理它。爲什麼你需要同時列出兩個列表?你想做什麼?它不能在ViewModel上嗎?這真的是你要做的UI邏輯嗎? –