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 错误