Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在等待加载WPF依赖项属性_C#_Wpf_Data Binding - Fatal编程技术网

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逻辑吗?