簡體   English   中英

綁定錯誤:WPF正在尋找錯誤對象上的屬性

[英]Binding error: WPF is looking for property on wrong object

我有一個名為observationEditorHost的用戶控件,(令人驚訝地)它充當另一個名為observationEditor的用戶控件的宿主頁。 我在“輸出”窗口中遇到綁定錯誤,並且在ObservationEditorHost的XAML中,對ObservatoryEditor的實例加下划線,並且工具欄顯示“對象引用未設置為對象的實例”。

輸出窗口中的錯誤消息是:

System.Windows.Data錯誤:40:BindingExpression路徑錯誤:在'object''ObservationEditorViewModel'(HashCode = 38856023)'上找不到'DataProviderID'屬性。 BindingExpression:路徑= DataProviderID; DataItem ='ObservationEditorViewModel'(HashCode = 38856023); 目標元素是'ObservationEditor'(Name =''); 目標屬性是“ ExclusiveDataProviderID”(類型“ Int32”)

問題:當然,我的目標是解決綁定錯誤,而這是我做不到的。 錯誤消息是此綁定的結果(完整的語句也顯示在下面的代碼中)

ExclusiveDataProviderID="{Binding DataProviderID}"

我的困惑來自錯誤消息的這一部分:在“對象”“ ObservationEditorViewModel”上找不到“ DataProviderID”屬性。

請注意以下代碼中的以下內容:

  • DataProviderID是ObservationEditorHost的屬性(不是錯誤消息中所述的ObservationEditor或ObservationEditorViewModel)。
  • 在構造函數中,將ObservationEditorHost的DataContext設置為其自身。

給定以上兩個參數,我不明白錯誤消息中所指出的WPF如何/為什么要在ObservationEditorViewModel上查找DataProviderID。

故障排除我已經完成了:

  • 從所有項目中刪除bin和obj目錄
  • 重新啟動Visual Studio
  • 將DataProviderID的名稱更改為zzzDataProviderID,以確保錯誤消息實際上與該屬性有關,而不與子控件中具有相同名稱的其他屬性有關。
  • 在整個解決方案中搜索了observationEditorViewModel,以確保我沒有在其他地方設置它
  • 觀察者編輯器主機和觀察者編輯器之間的所有其他綁定似乎都起作用,並且沒有其他錯誤消息。 如我的代碼所示,綁定的目標ExclusiveDataProviderID在綁定到DataProviderId時未設置。 但是,當我如下所示綁定到常量時,ExclusiveDataProviderID設置正確:

    <components:ObservationEditor ShowSeriesSelector =“ True” ExclusiveDataProviderID =“ 10”>

-代碼-

CelebrationEditorHost.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;
    }
}   

問題是您正在嘗試使用ObservationEditorHost中的屬性,但是您的DataContext是ObservationEditorViewModel。

我認為您應該可以使用FindAncestor找到正確的控件:

ExclusiveDataProviderID="{Binding DataProviderID, RelativeSource=
    {RelativeSource FindAncestor, AncestorType={x:Type DocumentPanel}}}"

  • 觀察者編輯器主機的DC是觀察者編輯器主機的代碼。
  • 觀察者編輯器已將其DC手動設置為觀察者編輯器視圖模型:

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

綁定引擎正在嘗試使用您在構造函數viewmodel中設置的上下文來解析DataProviderID的綁定。

此行中的綁定:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM