我有一个名为ObservationEditorHost的用户控件,它(令人惊讶地)充当另一个名为ObservationEditor的用户控件的主机页面。 我在Output窗口中得到一个绑定错误,并且在ObservationEditorHost的XAML中,ObservationEditor的实例加下划线,并且tooltop显示" Object引用未设置为对象的实例"。
输出窗口中的错误消息是:
System.Windows.Data错误:40:BindingExpression路径错误: ' DataProviderID'在' object'上找不到的属性 '' ObservationEditorViewModel' (的HashCode = 38856023)&#39 ;. BindingExpression:路径= DataProviderID; 的DataItem =' ObservationEditorViewModel' (的HashCode = 38856023);目标 元素是' ObservationEditor' (名称='&#39);目标属性是 ' ExclusiveDataProviderID' (键入' Int32')
问题:我的目标当然是解决绑定错误,我无法做到。错误消息是此绑定的结果(完整语句也显示在下面的代码中)
ExclusiveDataProviderID="{Binding DataProviderID}"
我的错误来自错误消息的这一部分:' DataProviderID'在' object'上找不到的属性'' ObservationEditorViewModel'
请从以下代码中注明以下内容:
鉴于上面的两个参数,我不明白WPF如何/为什么在ObservationEditorViewModel上查找DataProviderID,如错误消息中所述。
我已经完成的故障排除:
ObservationEditorHost之间的所有其他绑定 和ObservationEditor似乎工作,没有其他错误 消息。绑定的目标,ExclusiveDataProviderID,是 绑定到DataProviderId时没有设置,如我的代码所示。 但是当我绑定一个常量时,如下所示, ExclusiveDataProviderID设置正确:
<组件:ObservationEditor ShowSeriesSelector =" True" ExclusiveDataProviderID =" 10">
---代码---
ObservationEditorHost.xaml(这是整个控件。只删除了xaml名称空间)
<dxdo:DocumentPanel x:Class="VVM.ObservationEditorHost"
mc:Ignorable="d" Caption="Observation Editor"
Description="Observation Editor">
<components:ObservationEditor ShowSeriesSelector="True" ExclusiveDataProviderID="{Binding DataProviderID}"></components:ObservationEditor>
</dxdo:DocumentPanel>
ObservationEditorHost.xaml.cs(逐字)
public partial class ObservationEditorHost : DocumentPanel, INotifyPropertyChanged
{
private int _DataProviderID;
public int DataProviderID
{
get { return _DataProviderID; }
set
{
if (_DataProviderID != value)
{
_DataProviderID = value;
RaisePropertyChanged();
}
}
}
public ObservationEditorHost(DataProvider dp)
{
InitializeComponent();
DataProviderID = dp.ID;
DataContext = this;
}
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberNameAttribute] string propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
我无法提供ObservationEditor.xaml.cs的完整代码,因为它非常大。但是我会提供这个相关部分:
public partial class ObservationEditor : UserControl
{
public int ExclusiveDataProviderID
{
get { return (int)GetValue(ExclusiveDataProviderIDProperty); }
set { SetValue(ExclusiveDataProviderIDProperty, value); }
}
public static readonly DependencyProperty ExclusiveDataProviderIDProperty =
DependencyProperty.Register("ExclusiveDataProviderID", typeof(int), typeof(ObservationEditor), new PropertyMetadata(0, ExclusiveDataProviderID_Changed));
public ObservationEditor()
{
InitializeComponent();
ObservationEditorViewModel vm = ObservationEditorViewModel.Create().Result;
DataContext = vm;
}
}
答案 0 :(得分:1)
问题是您正在尝试使用ObservationEditorHost中的属性,但您的DataContext for是ObservationEditorViewModel。
我认为您应该能够使用FindAncestor找到正确的控件:
ExclusiveDataProviderID="{Binding DataProviderID, RelativeSource=
{RelativeSource FindAncestor, AncestorType={x:Type DocumentPanel}}}"
ObservationEditor手动将DC设置为 ObservationEditorViewModel:
ObservationEditorViewModel vm = ObservationEditorViewModel.Create().Result;
DataContext = vm;
绑定引擎正在尝试使用您在构造函数viewmodel中设置的上下文来解析DataProviderID的绑定。
此行中的绑定:
<components:ObservationEditor ExclusiveDataProviderID="{Binding DataProviderID}" />
发生在ObservationEditor的DC中,而不是父控件的DC(ObservationEditorHost
)。