2011-03-21 130 views
8

我一直在搜索出现在输出窗口中的这个错误的小时数。我对WPF中的绑定非常陌生,所以我确信有一些我错过了。BindingExpression path path error:property'not'on'object'

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

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

为什么你将一个不可枚举的对象设置为ItemsSource? – Landern 2011-03-21 19:02:34

+0

@Moses我已经改变了我的ItemsSource几次,看着不同的例子。我没有很好的理解什么应该去那里。我提出的代码是我尝试过的最后一次迭代,不一定是我原本想做的。 – isorfir 2011-03-21 19:18:35

回答

11

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

通常你在UserControl的构造函数中这样做。我通常添加这样一行:

this.RootElement.DataContext = myData; 

哪里rootElement的是你的用户控件的第一个子元素(内容)(平时喜欢网或StackPanel的面板)。

你的情况,那就是:

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

并确保之后的InitializeComponent()调用。

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

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

+0

这不是问题!实际上,datacontext不being使用任何地方因为他将listviewsource绑定到静态资源,而不是相对于当前的DataContext(它仍然会工作) – 2011-03-21 19:04:56

+0

啊,是的,好点,我同意你的回答如下 – cunningdave 2011-03-21 19:21:26

+0

看起来就是这样!错误不再我认为这与范围有关,但我没有找到一个清晰的例子来向我展示我需要什么,谢谢! – isorfir 2011-03-21 19:23:58

6

好像你要绑定的列表视图的ItemsSource到一个对象,而不是一个数组。一切工作都是视觉的吗或者你什么都看不到?

编辑: 如果你写的,而不是发生了什么:

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

这样的:

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

或任何类似集合定义

+0

@isorfir更新了我的答案,以反映我之前所说的内容... – 2011-03-21 19:08:45

+0

我应该提到所有事情都能正常工作,但无论如何都存在这些错误。使用代码时出现此错误:“ItemsSource正在使用时,操作无效。改为使用ItemsControl.ItemsSource来访问和修改元素。“ – isorfir 2011-03-21 19:13:48

+0

@isorfir这就是我之前提出的问题!不要担心你会看到这些错误消息,它们并不少见,而Bindingengine会计算出结果,错误,如果事情没有按时出现,但仍然一切正常 – 2011-03-21 19:15:44