BindingExpression路径错误:'object'上找不到属性

时间:2011-03-21 18:47:38

标签: c# .net wpf xaml binding

我一直在搜索输出窗口中显示的此错误。我对WPF中的绑定非常陌生,所以我确信有些东西我不知道。

错误的全文(每个绑定路径都有一个,都与此类似):

  

System.Windows.Data错误:39:BindingExpression路径错误:'object'''String'(HashCode = -842352750)'找不到'TestItem'属性。 BindingExpression:路径= TestItem; DataItem ='String'(HashCode = -842352750); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'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; }

2 个答案:

答案 0 :(得分:11)

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

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

this.RootElement.DataContext = myData;

其中RootElement是UserControl的第一个子元素(Content)(通常是Grid或StackPanel等面板)。

在你的情况下,它将是:

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

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

这只是范围界定的问题。您在usercontrol的根面板上设置datacontext。这是WPF的一个非常明显的部分。

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

答案 1 :(得分:6)

好像你将listviews itemssource绑定到一个对象,而不是一个数组。一切都在视觉上?或者你什么都看不见?

修改: 如果你写而不是:

会发生什么
<c:MyData x:Key="myDataSource"/>

这样:

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

或任何类似的集合定义