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

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

System.Windows.Data 错误:40:BindingExpression 路径错误:“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 的大师,所以我可能遗漏了一些东西,或者这里的语法有问题。任何帮助都会很棒!谢谢!

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案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 可能是多么痛苦...
    猜你喜欢
    • 2013-10-14
    • 2021-02-13
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多