Wie zu beheben einem "Verbindlichen Ausdruck Weg Fehler" in WPF?
Ich bin die Bindung eines observsable Sammlung von Modell-Objekte zu einem Daten-grid. Aber wenn ich die Bindung an die Sammlung, bekomme ich einen Pfad-Fehler in der peoprties.
Debuggen dieses Problem, habe ich überprüft, dass die öffentlichen Eigenschaften, die in der CustomerModel sind korrekt benannt, in die DataGrid binden. Und auch, dass die Sammlung wieder zu dem Modell ist nicht leer. Ich habe auch überprüft, dass die Daten der Kontext korrekt eingestellt ist, in die Ansicht code.
Denke ich, es wäre ein Fehler wegen der Art, wie ich angegeben habe verbindlich Pfad in xaml..
Die vollständigen details der Bindung Fehlermeldung lautet wie folgt, für jedes Feld:
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')
Kann jemand mich in die richtige Richtung, um zu Debuggen weiter?
DataGrid binden Pfad und Quelle sind wie folgt festgelegt:
<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>
View-Modell enthält eine Observable-collection von Typ CustomerModel, Kunden genannt. Dies ist, was ich eingestellt habe das DataGrid ItemSource an. (Habe ich entfernt andere code von VM für die Lesbarkeit)
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));
}
}
}
}
Und dies sind die Felder, die in der CustomerModel, also nicht sicher, warum die Eigenschaften nicht gefunden werden, während Bindung:
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));
}
}
}
Dies ist, wie die Daten-Rahmen ist in die Ansicht code hinter:
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;
}
}
xaml
?gerade bearbeitet die post zu zählen xaml.
Ich Denke, du bist etwas fehlt auf Ihrem Fenster.DataContext, ich kopiert Ihre Quelle und konnte das problem nicht reproduzieren. Entfernen Sie auch die Manuelle definition für die Spalte AutoGenerateColumns="True" ist genug, um zu sehen, Ihre datagrid funktioniert
Ich habe den code auf meine Frage, zeigt, wie ich den Daten-Kontext. Ich bin verwirrt, was das Problem ist hier, das grid gebunden ist, um die Abholung durch Kunden in der MainVM. Die Tabellenspalten sind dann an jedem Feld aus dieser Sammlung. Aber ich bekomme immer noch diese Bindung Pfad-Ausdruck. Sollte ich das definieren jedes Modell die Felder in der VM auch?
Versuchen Sie, füllen Sie Ihre observable-Auflistung mit Konstante Daten. entfernen Sie die CustomerDataService aus dem code. und füllen Sie es mit etwas wie : Kunden = new ObservableCollection<CustomerModel> { neue CustomerModel() {FirstName = "myname", LastName = "myfamily"}, new CustomerModel() {FirstName = "yourname", LastName = "yourfamily"} };
InformationsquelleAutor Brian J | 2015-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese binding-Fehler werden nicht auf Ihre DataGrid.
Zeigen Sie, dass Sie 3 Textboxen irgendwo die Namen
fNameTbx
,lNameTbx
, undemailTbx
. Ein DataGrid erzeugt nicht es ist Artikel mit einer Name-Eigenschaft, also es ist nicht der Verursacher dieser verbindlichen Fehler.Wenn Sie versuchen zu Lesen binding-Fehler, am besten ist es, Sie oben zu brechen, die durch Semikolons und Lesen Sie Sie nach hinten, als demonstrierte hier.
Beispielsweise
Kann auch gelesen werden als
Bedeutung irgendwo haben Sie
Wo die
DataContext
dieser TextBox ist vom TypMainViewModel
. UndMainViewModel
nicht über eine Eigenschaft derFirstName
.Ich würde empfehlen, der Suche Ihr Projekt für diesen Namen, oder Sie können verwenden Sie ein tool wie Snoop Debuggen databindings und der DataContext-Probleme zur Laufzeit.
Wenn Sie ein anderes Problem mit der Beschaffung von Datensätzen aus der DataService, wahrscheinlich ist es am besten zu öffnen eine andere Frage. Dieser code und die Frage ist in Bezug auf Ihre erste Frage, Sie sind also unwahrscheinlich, dass die Aufmerksamkeit erhalten, die Sie benötigen, über Ihre zweite Frage.
InformationsquelleAutor Rachel
Ausnahmen zeigen, dass das DataBinding engine ist auf der Suche für die Felder
FirstName
,LastName
usw. aufMainViewModel
im Gegensatz zuCustomerModel
.Brauchen Sie nicht zu geben Sie die Eigenschaft
Customers
im einzelnen binding-Ausdrücke für die Spalten:Binding="{Binding FirstName}"
etc.. aber ich bekomme die Fehlermeldung:"System.Windows.Data Error: 40 : BindingExpression path error: 'FirstName' property not found on 'object' ''MainViewModel' (HashCode=19160433)'. BindingExpression:Path=FirstName; DataItem='MainViewModel' (HashCode=19160433); target element is 'TextBox' (Name='fNameTbx'); target property is 'Text' (type 'String')"
Irgendwelche anderen Ideen?so erhalten Sie genau die gleiche Fehlermeldung, unabhängig davon, ob Sie
Customers.
oder nicht?ja, wenn ich mit Kunden.Vorname oder Vorname, das gleiche gilt für alle Felder, die bekomme ich diesen Fehler..ich habe nicht die einzelnen Eigenschaften definiert, die in der VM, aber ich die Daten-grid-Bindung statt, um eine observable-collection von Typ CustomerModel implementiert INPC in der VM, wie Sie sehen können in meinem code oben ^^
Ich sehe, dass Sie die Bindung des DataGrid an das
Customers
Eigentum, aber die Fehlermeldung sagt, dass die Bindung Motor ist auf der Suche nach diesen Eigenschaften auf der VM (die nicht vorhanden ist, natürlich).Auch ich merke, Sie sind mit
AutoGenerateColumns="True"
aber dann sind Sie manuell definieren Spalten?InformationsquelleAutor Ethan Cabiac
Ich hatte das gleiche Problem hatte, wenn ich den TextBlock Text Verbindlich innerhalb von ein DataTemplate und ich landete mit zu tun:
um es zu bekommen, um richtig zu arbeiten. Versuchen Sie, "DataContext." vor dem Haus und sehen, ob das funktioniert.
InformationsquelleAutor MattE