2016-08-22 77 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逻辑吗? –