正在等待加载WPF依赖项属性

时间:2016-08-22 12:42:02

标签: c# wpf data-binding

我的控件中有两个依赖项属性。两者都绑定到IReadOnlyList不同类型。

#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中的两个列表不是一个选项,因为这是一个与视图相关的任务。

1 个答案:

答案 0 :(得分:2)

那不是真的。绑定以确定性方式解决。如果您正在使用MVVM模式,那么您应该可以在DataContextChanged事件上进行连接,以确保ViewModel现在设置为View,并且ViewModel调用OnPropertyChanged 1}}那就是调用OnValueChanged回调的时间。

在您的ViewModel中,您需要设置QuestionsAnswers,然后在OnPropertyChanged上明确调用Answers,以便您知道何时触发回调并执行那里的UI逻辑。