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

Posted

技术标签:

【中文标题】BindingExpression 路径错误:在“对象”上找不到属性【英文标题】:BindingExpression path error: property not found on 'object' 【发布时间】:2011-07-19 22:10:44 【问题描述】:

我一直在寻找出现在输出窗口中的这个错误的几个小时。我对 WPF 中的绑定很陌生,所以我确定我缺少一些东西。

错误全文(每个绑定路径都有一个,都和这个类似):

System.Windows.Data 错误:39:BindingExpression 路径错误:在“对象”“字符串”(HashCode=-842352750)上找不到“TestItem”属性。绑定表达式:路径=测试项; DataItem='String' (HashCode=-842352750);目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

编辑:似乎一切正常,但我在输出窗口中收到这些错误。

XAML:

<UserControl>
    <UserControl.Resources>
        <c:MyData x:Key="myDataSource"/>
        <DataTemplate x:Key="image">
            <Image x:Name="TheImage" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="Binding Path=PassFail" Value="PASS">
                    <Setter TargetName="TheImage" Property="Source" Value="Images/accept.png" />
                </DataTrigger>
                <DataTrigger Binding="Binding Path=PassFail" Value="FAIL">
                    <Setter TargetName="TheImage" Property="Source" Value="Images/delete.png" />
                </DataTrigger>
                <DataTrigger Binding="Binding Path=PassFail" Value="WARNING">
                    <Setter TargetName="TheImage" Property="Source" Value="Images/warning.png" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
        <Storyboard x:Key="OnMouseLeftButtonDown1"/>
    </UserControl.Resources>
    <UserControl.DataContext>
        <Binding Source="StaticResource myDataSource"/>
    </UserControl.DataContext>
    <ListView Margin="0,94,-4,-7" x:Name="lsvwOutput" ItemsSource="Binding Source=StaticResource myDataSource"  MouseUp="lsvwOutput_MouseUp" FontFamily="Verdana">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Test Item" Width="300"  DisplayMemberBinding="Binding Path=TestItem" />
                <GridViewColumn Header="Information" Width="0" DisplayMemberBinding="Binding Path=Information"/>
                <GridViewColumn Header="Result" Width="0" DisplayMemberBinding="Binding Path=PassFail"/>
                <GridViewColumn Header="Result" CellTemplate="StaticResource image" />
            </GridView>
        </ListView.View>
    </ListView
</UserControl>

后面的代码:

public class MyData : INotifyPropertyChanged

    private string _testitem = "";
    private string _information = "";
    private string _passfail = "";

    public string TestItem 
        get  return _testitem; 
        set
        
            _testitem = value;
            OnPropertyChanged("TestItem");
        

    
    public string Information 
        get  return _information; 
        set
        
            _information = value;
            OnPropertyChanged("Information");
        
    
    public string PassFail 
        get  return _passfail; 
        set
        
            _passfail = value;
            OnPropertyChanged("PassFail");
        
    
    public string Text  get; set; 

【问题讨论】:

为什么要为 ItemsSource 设置一个不可枚举的对象? @Moses 我现在已经多次更改了我的 ItemsSource,查看不同的示例。我不太了解应该去那里。我提出的代码是我尝试的最后一次迭代,不一定是我最初会做的。 【参考方案1】:

似乎您将 listviews itemssource 绑定到一个对象,而不是一个数组。一切都在视觉上工作吗?还是什么都没看到?

编辑: 如果你写而不是:

<c:MyData x:Key="myDataSource"/>

这个:

<x:Array x:Key="myDataSource" Type="x:Type c:MyData">
  <c:MyData />      
</x:Array>

或任何类似的集合定义

【讨论】:

我应该提到一切正常,但无论如何都存在这些错误。使用您的代码时出现此错误:“使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。” @isorfir 这就是我的问题所在!不要担心您会看到这些错误消息。他们并不少见。虽然 Bindingengine 可以解决问题,但如果某些东西没有按时出现,可能会出现错误,但一切正常 马库斯,我把你撞了,因为我认为你比我更正确。【参考方案2】:

您不想在 UserControl 上设置 DataContext。相反,您希望将其设置在 UserControl 的范围内。

通常您在 UserControl 的构造函数中执行此操作。我通常会添加这样的一行:

this.RootElement.DataContext = myData;

其中 RootElement 是您的 UserControl(通常是像 Grid 或 StackPanel 这样的面板)的第一个子元素(内容)。

在你的情况下是:

this.lsvwOutput.DataContext = FindResource("myDataSource");

并确保它在 InitializeComponent() 调用之后

这只是范围界定的问题。您在用户控件的根面板上设置数据上下文。这是 WPF 中一个非常不明显的部分。

更新:正如 Markus 在下面指出的,在列表视图的情况下,您想要设置一个数据数组,而不仅仅是一个数据点。在构造函数中设置 DataContext 时要考虑到这一点。

【讨论】:

这不是问题!实际上,datacontext 并没有在任何地方使用,因为他将 listviews itemssource 绑定到静态资源,而不是相对于当前 DataContext(仍然可以工作) 看起来就是这样!错误不再出现。我认为这与范围有关,但我没有找到一个明确的例子来告诉我我需要什么。谢谢! 那么问题可能有两个方面 - 我同意您正在创建数据实例而不是数组,就像 Markus 下面所说的那样。但无论何时创建 WPF,这是一个很好的模式,并且坦率地说希望它只是默认的方式,因为它会让初学者更容易创作控件。 @cunningdave 有没有办法消除这个错误?我有一个绑定到可能不存在的属性的控件。我想禁用绑定或至少禁用此绑定的错误。我试过 FallbackValue,但它不起作用。 @Shimmy 没有办法摆脱它,因为它是一个有效的错误。然而,绑定被设计成故障安全的——即使它们在输出中报告错误,也没关系。例如,在使用 Blend 这样的设计工具时,这是一个有效的场景。在运行时,您可能希望绑定到在设计时基本上不可能建模的动态属性。真正摆脱错误的唯一方法是检测隐藏代码中的属性并仅在它存在时设置它,如果您不了解绑定的 ViewModel,可能会使用反射。

以上是关于BindingExpression 路径错误:在“对象”上找不到属性的主要内容,如果未能解决你的问题,请参考以下文章

[BindingExpression尝试绑定到C#类字段时发生路径错误

如何使用WPF从bindingexpression解析绑定对象?

找不到WPF绑定属性

System.Windows.Data 错误:5; FontSizeConverter 导致问题

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

WPF datagrid.rowstyle 绑定