Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决“问题”;绑定表达式路径错误“;在WPF中?_Wpf_Mvvm_Binding_Properties - Fatal编程技术网

如何解决“问题”;绑定表达式路径错误“;在WPF中?

如何解决“问题”;绑定表达式路径错误“;在WPF中?,wpf,mvvm,binding,properties,Wpf,Mvvm,Binding,Properties,我正在将模型对象的可观测集合绑定到数据网格。但是,当我设置集合的绑定时,我得到了一个到peoprities的路径错误 在调试这个问题时,我检查了CustomerModel中的公共属性是否在DataGrid绑定中正确命名。而且返回到模型的集合不是空的。我还检查了视图的代码隐藏中是否正确设置了数据上下文 我认为这可能是一个错误,因为我在xaml中指定了绑定路径 对于每个字段,绑定错误的完整详细信息如下所示: System.Windows.Data Error: 40 : BindingExpress

我正在将模型对象的可观测集合绑定到数据网格。但是,当我设置集合的绑定时,我得到了一个到peoprities的路径错误

在调试这个问题时,我检查了CustomerModel中的公共属性是否在DataGrid绑定中正确命名。而且返回到模型的集合不是空的。我还检查了视图的代码隐藏中是否正确设置了数据上下文

我认为这可能是一个错误,因为我在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>

异常表明数据绑定引擎正在查找
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}"/>