c# - BindingExpression 路径错误 : property not found on 'object'

标签 c# .net wpf xaml binding

对于出现在输出窗口中的这个错误,我已经搜索了几个小时。我对 WPF 中的绑定(bind)还很陌生,所以我确定我遗漏了什么。

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

System.Windows.Data Error: 39 : BindingExpression path error: 'TestItem' property not found on 'object' ''String' (HashCode=-842352750)'. BindingExpression:Path=TestItem; DataItem='String' (HashCode=-842352750); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

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

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; }

最佳答案

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

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

this.RootElement.DataContext = myData;

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

在您的情况下,它将是:

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

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

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

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

关于c# - BindingExpression 路径错误 : property not found on 'object' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5382164/

相关文章:

c# - OPC UA基础SDK : Server does not have an instance certificate assigned

c# - 字符串数组加字符串不报错,为什么呢?

c# - 为什么Linq-to-SQL生成的代码是错误的,但是编译的时候却没有报错

c# - XAML 中的泛型

c# - Wpf:图像控制不支持 .TGA 文件

c# - 如何防止点击通过控件传递到其下方的控件

c# - 从 WCF 服务派生的进程变得空闲

c# - 从当前返回具有日期时间的每条记录的大型 linq 查询中获取 "latest"日期时间

c# - NuGet 包 : how to add references to webservices?

python - 无法将.Net的SaveFileDialog与pythonnet一起使用