绑定错误:WPF正在查找错误对象

时间:2015-10-11 20:50:53

标签: c# wpf xaml datacontext

我有一个名为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'

请从以下代码中注明以下内容:

  • DataProviderID是ObservationEditorHost的属性(不是 ObservationEditor或ObservationEditorViewModel如中所述 错误信息)。
  • ObservationEditorHost的DataContext设置为 本身就在构造函数中。

鉴于上面的两个参数,我不明白WPF如何/为什么在ObservationEditorViewModel上查找DataProviderID,如错误消息中所述。

我已经完成的故障排除:

  • 从所有项目中删除了bin和obj目录
  • 重新启动Visual Studio
  • 将DataProviderID的名称更改为 zzzDataProviderID确保错误消息实际上是相关的 到这个属性而不是同名的不同属性 儿童控制。
  • 搜索ObservationEditorViewModel的整个解决方案,以确保我没有将其设置在其他地方
  • 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;
    }
}   

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试使用ObservationEditorHost中的属性,但您的DataContext for是ObservationEditorViewModel。

我认为您应该能够使用FindAncestor找到正确的控件:

ExclusiveDataProviderID="{Binding DataProviderID, RelativeSource=
    {RelativeSource FindAncestor, AncestorType={x:Type DocumentPanel}}}"
  • ObservationEditorHost&amp; DC是ObservationEditorHost的代码隐藏。
  • ObservationEditor手动将DC设置为 ObservationEditorViewModel:

    ObservationEditorViewModel vm = ObservationEditorViewModel.Create().Result;
    DataContext = vm;
    

绑定引擎正在尝试使用您在构造函数viewmodel中设置的上下文来解析DataProviderID的绑定。

此行中的绑定:

 <components:ObservationEditor ExclusiveDataProviderID="{Binding DataProviderID}" />

发生在ObservationEditor的DC中,而不是父控件的DC(ObservationEditorHost)。