System.Windows.Data 错误:40:BindingExpression 路径错误:

Posted

技术标签:

【中文标题】System.Windows.Data 错误:40:BindingExpression 路径错误:【英文标题】:System.Windows.Data Error: 40 : BindingExpression path error: 【发布时间】:2015-08-11 02:01:58 【问题描述】:

真的很烦人的问题。代码似乎工作正常,但运行时,我看到这个错误被抛出:

“IsOpen” 在“对象”“MainViewModel”(HashCode=33664731)上找不到属性。 绑定表达式:路径=IsOpen; DataItem='MainViewModel' (哈希码=33664731);目标元素是'Popup'(名称='LoginPopup'); 目标属性是“IsOpen”(类型“布尔”)

我了解在 MainViewModel 上尝试 LoginPopup 绑定的 IsOpen 属性时存在某种问题,但由于 MainViewModel 中没有 IsOpen 属性而失败。很好,但是我绑定的DataContext不是mainviewmodel,而是LoginPopupViewModel(ViewModelLocator类中的LoginPopup)。 Intellisense 似乎同意我的观点,即事物已绑定到 LoginPopupViewModel,就好像我在 IsOpen 的 Binding 部分中键入其他内容一样,它抱怨“无法解析 LoginPopupViewModel 数据上下文中的属性”,这是应该的。

这是 XAML 代码的一部分:

<Popup x:Name="LoginPopup"  PlacementTarget="Binding ElementName=LoginButton"  
       Placement="Bottom"
       HorizontalOffset="-40" VerticalOffset="35" StaysOpen="False" 
       IsOpen=" Binding IsOpen"
       DataContext="Binding LoginPopup, Mode=OneWay, Source=StaticResource Locator" 
       Grid.ColumnSpan="3" Grid.Column="0"
           Margin="0,0,0.333,0"
           Grid.Row="0" Grid.RowSpan="2">

我不是 WPF 的大师,所以我可能遗漏了一些东西,或者这里的语法有问题。任何帮助都会很棒!谢谢!

【问题讨论】:

【参考方案1】:

您收到该错误是因为DataContext 绑定在IsOpen 绑定之后,所以当解析器遇到IsOpen 时,DataContext 当前是MainViewModel(由依赖属性继承设置)。然后 WPF 处理 DataContext=.. 并重新评估 IsOpen 绑定。

例如2 个绑定最终相同,但一个显示错误

这会导致输出错误,但有效

    <TextBlock Text="Binding TextB" DataContext="Binding B"></TextBlock>

这不会出错

    <TextBlock DataContext="Binding B" Text="Binding TextB"></TextBlock>

原答案


你得到的错误是因为:

IsOpen="Binding IsOpen"

无法绑定成功。

您将它的 DataContext 绑定到 StaticResource Locator,以及该资源上的属性 LoginPopup。我假设Locator.LoginPopup 返回一个MainViewModel

Locator.LoginPopup 是什么,IsOpen="Binding IsOpen" 的目标是什么?这是某个视图模型上的属性吗?

【讨论】:

Locator 是 ViewModelLocator.cs 类的键。 Locator.LoginPopup 返回一个 LoginPopupViewModel 而不是 MainViewModel。将弹出窗口上的 IsOpen 绑定到 LoginPopupViewModel 上的 IsOpen 属性允许我做一些事情,其中​​之一是在属性更改时打开/关闭虚拟键盘,这确实有效,这很奇怪,因为出现了这个错误在运行时的输出窗口中。 实际上,该代码不起作用,这更有意义。虚拟键盘响应弹出窗口上的文本字段被聚焦/不聚焦。 可能发生的情况是 IsOpen 在绑定 DataContext 之前绑定。尝试将 DataContext 绑定放在 IsOpen 绑定之上 能分享一下LoginPopupViewModel,还有Locator那一点,还有Locator资源声明吗? 你是对的,而且,我将 DataContext 更改为 DataContext="Binding Path=LoginPopup, Mode=OneWay, Source=StaticResource Locator",添加显式路径,一切都很好。谢谢! XAML 可能是多么痛苦...

以上是关于System.Windows.Data 错误:40:BindingExpression 路径错误:的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中使用 DataTable 和 DataGrid 时发生 System.Windows.Data 错误

找不到WPF绑定属性

WPF 管理 FrameworkElement 未找到错误

Source=null 的 ImageSourceConverter 错误

无法将XAML按钮可见性与C#视图模型专用可见性变量绑定

BindingExpression 路径错误:在“对象”上找不到属性