2015-11-19 77 views
1

我將一個可觀察的模型對象集合綁定到數據網格。但是當我設置綁定到集合時,我得到了一個路徑錯誤的peoprties。如何解決WPF中的「綁定表達式路徑錯誤」?

在調試此問題時,我檢查了CustomerModel中的公共屬性在DataGrid綁定中正確命名。而且返回到模型的集合也不是空的。我還檢查了數據上下文在View的代碼後面正確設置。

我想這可能是一個錯誤,由於我指定的XAML中綁定路徑的方式..

裝訂錯誤的完整細節如下,每個字段:

System.Windows.Data Error: 40 : BindingExpression path error: 'FirstName' property not found on 'object' ''MainViewModel' (HashCode=55615518)'. BindingExpression:Path=FirstName; DataItem='MainViewModel' (HashCode=55615518); target element is 'TextBox' (Name='fNameTbx'); target property is 'Text' (type 'String') 

System.Windows.Data Error: 40 : BindingExpression path error: 'LastName' property not found on 'object' ''MainViewModel' (HashCode=55615518)'. BindingExpression:Path=LastName; DataItem='MainViewModel' (HashCode=55615518); target element is 'TextBox' (Name='lNameTbx'); target property is 'Text' (type 'String') 

System.Windows.Data Error: 40 : BindingExpression path error: 'Email' property not found on 'object' ''MainViewModel' (HashCode=55615518)'. BindingExpression:Path=Email; DataItem='MainViewModel' (HashCode=55615518); target element is 'TextBox' (Name='emailTbx'); target property is 'Text' (type 'String') 

任何人都可以指出我在正確的方向,爲了進一步調試?

DataGrid的綁定路徑和源設置如下:

    <DataGrid Name="infogrid" 
           Grid.Row="0" 
           Grid.RowSpan="3" 
           Grid.Column="1" 
           Grid.ColumnSpan="3" 
           AutoGenerateColumns="False" 
           ItemsSource="{Binding Customers}" 
           SelectedItem="{Binding SelectedCustomer}"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding Customers.Id}" Header="ID" /> 
          <DataGridTextColumn Binding="{Binding Customers.FirstName}" Header="First Name" /> 
          <DataGridTextColumn Binding="{Binding Customers.LastName}" Header="Last Name" /> 
          <DataGridTextColumn Binding="{Binding Customers.Email}" Header="Email" /> 
         </DataGrid.Columns> 
        </DataGrid> 

視圖模型包含類型CustomerModel的觀察集合,稱爲客戶。這是我已經設置了DataGrid ItemSource。 (我已經刪除其他代碼爲VM可讀性)

namespace MongoDBApp.ViewModels 
{ 

    class MainViewModel : INotifyPropertyChanged 
    { 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     private ICustomerDataService _customerDataService; 


     public MainViewModel(ICustomerDataService customerDataService) 
     { 
      this._customerDataService = customerDataService; 
      QueryDataFromPersistence(); 
     } 



     private ObservableCollection<CustomerModel> customers; 
     public ObservableCollection<CustomerModel> Customers 
     { 
      get 
      { 
       return customers; 
      } 
      set 
      { 
       customers = value; 
       RaisePropertyChanged("Customers"); 
      } 
     } 



     private void QueryDataFromPersistence() 
     { 
      Customers = _customerDataService.GetAllCustomers().ToObservableCollection(); 

     } 



     private void RaisePropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 



    } 
} 

而且這些都是在CustomerModel,所以不知道爲什麼屬性沒有被綁定過程中發現的字段:

public class CustomerModel : INotifyPropertyChanged 
    { 

     private ObjectId id; 
     private string firstName; 
     private string lastName; 
     private string email; 


     [BsonElement] 
     ObservableCollection<CustomerModel> customers { get; set; } 

     /// <summary> 
     /// This attribute is used to map the Id property to the ObjectId in the collection 
     /// </summary> 
     [BsonId] 
     public ObjectId Id { get; set; } 

     [BsonElement("firstName")] 
     public string FirstName 
     { 
      get 
      { 
       return firstName; 
      } 
      set 
      { 
       firstName = value; 
       RaisePropertyChanged("FirstName"); 
      } 
     } 

     [BsonElement("lastName")] 
     public string LastName 
     { 
      get 
      { 
       return lastName; 
      } 
      set 
      { 
       lastName = value; 
       RaisePropertyChanged("LastName"); 
      } 
     } 

     [BsonElement("email")] 
     public string Email 
     { 
      get 
      { 
       return email; 
      } 
      set 
      { 
       email = value; 
       RaisePropertyChanged("Email"); 
      } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 
     private void RaisePropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

這如何在數據上下文被設置在查看的代碼背後:

public partial class MainView : Window 
    { 
     private MainViewModel ViewModel { get; set; } 
     private static ICustomerDataService customerDataService = new CustomerDataService(CustomerRepository.Instance); 


     public MainView() 
     { 
      InitializeComponent(); 
      ViewModel = new MainViewModel(customerDataService); 
      this.DataContext = ViewModel; 

     } 

    }   
+0

你能否提供相關的'xaml'? –

+0

@EnghanCabiac剛編輯過這篇文章,其中包括xaml。 –

+1

我猜你錯過** Window.DataContext **上的一些東西,我複製了你的源代碼,並且無法重現問題。同時刪除手動列定義** AutoGenerateColumns =「True」**足以查看您的數據網格的工作原理 –

回答

6

這些綁定錯誤是不相關的數據網格。

它們表示您在名稱fNameTbx,lNameTbxemailTbx的某個地方有3個文本框。 DataGrid不會使用Name屬性生成它的項目,因此它不是導致這些綁定錯誤的項目。

當試圖讀取綁定錯誤時,最好用分號分開並向後讀取它們,如here所示。

例如,

System.Windows.Data Error: 40 : BindingExpression path error: 'FirstName' property not found on 'object' ''MainViewModel' (HashCode=55615518)'. BindingExpression:Path=FirstName; DataItem='MainViewModel' (HashCode=55615518); target element is 'TextBox' (Name='fNameTbx'); target property is 'Text' (type 'String')

也可以讀爲

  • 目標屬性是 '文本'(類型 '字符串')
  • 目標元件是 '文字框'(名稱=」 fNameTbx');
  • DataItem ='MainViewModel'(HashCode = 55615518);
  • BindingExpression路徑錯誤:'對象'''MainViewModel'(HashCode = 55615518)'找不到'FirstName'屬性。 BindingExpression:路徑=姓;

含義的地方,你有

<TextBox Name="fNameTbx" Text="{Binding FirstName}" /> 

如果這TextBox的DataContextMainViewModel類型。而MainViewModel沒有FirstName的財產。

我建議您在項目中搜索這些名稱,或者使用Snoop這樣的工具在運行時調試數據綁定和DataContext問題。

+0

我已經修復了這個錯誤,我必須將綁定設置爲SelectedCustomer.FirstName等。我遇到了另一個數據服務的問題,從存儲庫中提取數據,查看我的評論以上 –

+0

@BrianJ如果您在從DataService獲取記錄時遇到不同的問題,最好打開一個關於它的不同問題。此代碼和問題與您的第一個問題有關,因此您不太可能獲得關於第二個問題的注意力。 – Rachel

1

例外情況表明,數據綁定引擎尋找領域FirstName,與CustomerModel相反,在MainViewModel上有等。

你並不需要在個人綁定表達式指定屬性Customers爲列:

<DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Id}" Header="ID" /> 
    <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name" /> 
    <DataGridTextColumn Binding="{Binding LastName}" Header="Last Name" /> 
    <DataGridTextColumn Binding="{Binding Email}" Header="Email" /> 
</DataGrid.Columns> 
+0

我以前試過這個解決方案,設置'Binding =「{Binding FirstName}」'等等..但是我得到錯誤:'「System.Windows.Data錯誤:40:BindingExpression路徑錯誤:'FirstName'對象'''MainViewModel'(HashCode = 19160433)'。BindingExpression:Path = FirstName; DataItem ='MainViewModel'(HashCode = 19160433);目標元素爲'TextBox'(Name ='fNameTbx');目標屬性爲'Text' (輸入'String')「'其他想法? –

+0

@BrianJ,無論您是否使用Customers.',都會得到相同的確切錯誤? –

+0

是的,如果我使用Customer.FirstName或FirstName,所有字段相同,我得到此錯誤..我沒有在虛擬機中定義的單個屬性,但是我將數據網格綁定設置爲一個可觀察的類型爲CustomerModel的集合,它在虛擬機中實現INPC,如您在上面的代碼中所見^^ –

相關問題