如何解决“问题”;绑定表达式路径错误“;在WPF中?
我正在将模型对象的可观测集合绑定到数据网格。但是,当我设置集合的绑定时,我得到了一个到peoprities的路径错误 在调试这个问题时,我检查了CustomerModel中的公共属性是否在DataGrid绑定中正确命名。而且返回到模型的集合不是空的。我还检查了视图的代码隐藏中是否正确设置了数据上下文 我认为这可能是一个错误,因为我在xaml中指定了绑定路径 对于每个字段,绑定错误的完整详细信息如下所示:如何解决“问题”;绑定表达式路径错误“;在WPF中?,wpf,mvvm,binding,properties,Wpf,Mvvm,Binding,Properties,我正在将模型对象的可观测集合绑定到数据网格。但是,当我设置集合的绑定时,我得到了一个到peoprities的路径错误 在调试这个问题时,我检查了CustomerModel中的公共属性是否在DataGrid绑定中正确命名。而且返回到模型的集合不是空的。我还检查了视图的代码隐藏中是否正确设置了数据上下文 我认为这可能是一个错误,因为我在xaml中指定了绑定路径 对于每个字段,绑定错误的完整详细信息如下所示: System.Windows.Data Error: 40 : BindingExpress
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>
异常表明数据绑定引擎正在查找
MainViewModel
上的字段FirstName
、LastName
等,而不是CustomerModel
您不需要在列的各个绑定表达式中指定属性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>
这些绑定错误与DataGrid无关 它们表示您在名称
fNameTbx
、lNameTbx
和emailTbx
的某处有3个文本框。DataGrid不会生成具有Name属性的项,因此它不是导致这些绑定错误的对象
当试图读取绑定错误时,最好用分号将它们分开,并向后读取,如所示
比如说,
System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“MainViewModel”(HashCode=55615518)上找不到“FirstName”属性。BindingExpression:Path=FirstName;DataItem='MainViewModel'(HashCode=55615518);目标元素是“TextBox”(Name='fNameTbx');目标属性为“Text”(类型为“String”)
也可以理解为
- 目标属性为“Text”(类型为“String”)
- 目标元素是“TextBox”(Name='fNameTbx')李>
- DataItem='MainViewModel'(HashCode=55615518)李>
- BindingExpression路径错误:在“对象”“MainViewModel”(HashCode=55615518)上找不到“FirstName”属性。BindingExpression:Path=FirstName李>
<TextBox Name="fNameTbx" Text="{Binding FirstName}" />
其中,此文本框的DataContext
类型为MainViewModel
。而MainViewModel
没有FirstName
属性
我建议您在项目中搜索这些名称,或者您可以使用类似于在运行时调试数据绑定和DataContext问题的工具。当我在DataTemplate中有TextBlock文本绑定时,我也遇到了同样的问题,最后我不得不做:
Text={Binding DataContext.SuccessTxt}
让它正常工作。尝试在属性前面添加“DataContext.”,看看是否有效。public Window()
public Window()
{
this.DataContext = this;
InitializeComponent();
}
public string Name {get;set;}
//xaml
<TextBlock Text="{Binding Name}"/>
{
this.DataContext=this;
初始化组件();
}
公共字符串名称{get;set;}
//xaml
this.DataContext=this代码>在初始化组件()之前代码>
(在InitializeComponent()
中加载xaml之前,DataContext需要可用)
属性Name
应该是public
和{get;}
(如果是私有的,则wpf无法访问)您能否提供相关的xaml
?@EthanCabiac刚刚编辑了这篇文章以包含xaml。我猜您的窗口中缺少了一些内容。DataContext,我复制了您的源代码,无法重现问题。另外,删除手动列定义AutoGenerateColumns=“True”足以查看您的数据网格works@HosseinShahdoost我在问题中添加了代码,显示了如何设置数据上下文。我对这里的问题感到困惑,网格绑定到MainVM中的客户集合。然后将网格列绑定到该集合中的每个字段。但我仍然得到这个绑定路径表达式。我是否也应该在VM中定义每个模型字段?尝试用常量数据填充可观察的集合。从代码中删除CustomerDataService。并用如下内容填充它:Customers=newobserveCollection{new CustomerModel(){FirstName=“myname”,LastName=“myfamily”},new CustomerModel(){FirstName=“yourname”,LastName=“yourfmily”};我以前尝试过这个解决方案,设置Binding=“{Binding FirstName}”
等。。但是我得到了错误:“System.Windows.Data错误:40:BindingExpression路径错误:'FirstName'属性未在'object''MainViewModel'(HashCode=19160433')上找到。BindingExpression:path=FirstName;DataItem='MainViewModel'(HashCode=19160433);目标元素是'TextBox'(Name='fNameTbx');目标属性是'Text'(type'String')”
还有其他想法吗?@BrianJ所以无论您是否使用客户,您都会得到相同的错误。
是否?是的,如果我使用Customer.FirstName或FirstName,则所有字段都会出现此错误。我没有在VM中定义单独的属性,但是我将数据网格绑定改为CustomerModel类型的可观察集合,该集合在VM中实现INPC,正如您在上面的代码中所看到的^^^我看到您将数据网格绑定到Customers
属性,但错误消息表示绑定引擎正在VM上查找这些属性(显然不存在)。我还注意到您正在使用AutoGenerateColumns=“True”
但是您正在手动定义列?我已经修复了这个错误,我必须将绑定设置为SelectedCustomer.FirstName等。我遇到了从存储库中提取数据的数据服务的另一个问题,请参阅我的评论above@BrianJ如果您在从DataService获取记录时遇到不同的问题,它将也许最好是提出一个不同的问题
<TextBox Name="fNameTbx" Text="{Binding FirstName}" />
Text={Binding DataContext.SuccessTxt}
public Window()
{
this.DataContext = this;
InitializeComponent();
}
public string Name {get;set;}
//xaml
<TextBlock Text="{Binding Name}"/>