C# 正在等待加载WPF依赖项属性
我的控件中有两个依赖属性。两者都绑定到不同类型的C# 正在等待加载WPF依赖项属性,c#,wpf,data-binding,C#,Wpf,Data Binding,我的控件中有两个依赖属性。两者都绑定到不同类型的IReadOnlyList #region QuestionsProperty public static readonly DependencyProperty QuestionsProperty = DependencyProperty.Register("Questions", typeof(IReadOnlyList<IQuestion>), typeof(DecisionsControl), new Framework
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
#地区问题属性
公共静态只读从属属性问题属性=
DependencyProperty.Register(“问题”、类型of(IReadOnlyList)、类型of(DecisionsControl)、新框架属性元数据(OnQuestionsChanged));
公共IReadOnlyList问题
{
获取{return(IReadOnlyList)GetValue(QuestionsProperty);}
set{SetValue(问题属性,值);}
}
私有静态void OnQuestionsChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
DecisionsControl=d作为DecisionsControl;
控制?.OnQuestionsChanged((IReadOnlyList)e.OldValue,(IReadOnlyList)e.NewValue);
}
问题更改后的公共无效(IReadOnlyList oldValue,IReadOnlyList newValue)
{
//这里需要两个列表
}
#端区
#区域应答器属性
公共静态只读从属属性应答属性=
DependencyProperty.Register(“应答”、类型of(IReadOnlyList)、类型of(DecisionsControl)、新框架属性元数据(OnAnswersChanged));
公共IReadOnlyList答案
{
获取{return(IReadOnlyList)GetValue(answersprroperty);}
set{SetValue(应答属性,值);}
}
NSWERSCHANGED上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
DecisionsControl=d作为DecisionsControl;
控件?.OnAnswersChanged((IReadOnlyList)e.OldValue,(IReadOnlyList)e.NewValue);
}
拒绝登录时的公共无效(IReadOnlyList oldValue,IReadOnlyList newValue)
{
//这里需要两个列表
}
#端区
控件需要两个列表才能正确显示其内容。ViewModel的作者可以随意加载这两个属性,所以我不知道哪个列表首先可用
我正在寻找一种方法来等待两个列表都可用。我猜CoreceValue
方法不会有帮助,因为它无法强制依赖属性从ViewModel加载新值
合并ViewModel中的两个列表不是一个选项,因为这是一个与视图相关的任务。不是这样。绑定是以确定性的方式解决的。如果您使用的是MVVM模式,那么您应该能够将其连接到
DataContextChanged
事件,以确保ViewModel现在设置为View
,并且当您的ViewModel
调用OnPropertyChanged
时,即调用OnValueChanged
回调的时间
在ViewModel中,您需要设置
问题
和答案
,然后在答案
上显式调用OnPropertyChanged
,这样您就可以知道何时触发回调并在那里执行UI逻辑。我认为“确定性”是“用户可以随意更改两个属性”的一种方式。因此,我需要以一种与首先应用哪个属性无关的方式来设计控件。我将相应地编辑我的问题。您必须后退一步,重新思考您的设计,不要将其相互耦合,因为如果您说“用户可以随意更改两个属性”,则您的逻辑似乎不正确。如果他们先更改答案,然后更改问题,会发生什么?您仅在应答回调时处理它。为什么同时需要两个列表?你想干什么?它不能不在ViewModel上吗?这真的是你要做的UI逻辑吗?