2011-03-21 30 views
8

He estado buscando horas en este error que aparece en la ventana de salida. Soy bastante nuevo para las vinculaciones en WPF, así que estoy seguro de que me falta algo.Error de ruta de BindingExpression: propiedad no encontrada en 'objeto'

texto completo del error (hay uno para cada ruta de enlace, todos similares a éste):

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')

EDIT: Todo parece funcionar como debe ser, pero me da estos errores en la ventana de salida.

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> 

Código atrás:

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

¿Por qué establece un objeto no enumerable en ItemsSource? – Landern

+0

@Moses He cambiado varias veces mi ItemsSource, mirando diferentes ejemplos. No entiendo muy bien qué debería ir allí. El código que planteé fue la última iteración que probé, no necesariamente lo hubiera hecho originalmente. – isorfir

Respuesta

11

usted no desea establecer la DataContext en UserControl. En cambio, desea establecerlo en el alcance del UserControl.

Normalmente esto se hace en el constructor del UserControl. Yo suelo añadir una línea como esta:

this.RootElement.DataContext = myData; 

Dónde RootElement es el primer sub-elemento (el contenido) de su control de usuario (por lo general como un panel de cuadrícula o StackPanel).

En su caso sería:

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

Y se asegura de que sea después de la llamada InitializeComponent().

Es solo una cuestión de alcance. Establece el contexto de datos en el panel raíz del control de usuario. Esta es una parte realmente no obvia de WPF.

ACTUALIZACIÓN: Como señala Markus a continuación, en el caso de una vista de lista, desea establecer una matriz de datos, no solo un punto de datos. Téngalo en cuenta al configurar el DataContext en su constructor.

+0

¡ese no es el problema! De hecho, ese contexto de datos no se usa en ningún lado ya que él está vinculando esa lista fuentes de elementos al recurso estático y no relativa al DataContext actual (que todavía habría funcionado) –

+0

Ah sí, buen punto. Estoy de acuerdo con su respuesta a continuación. – cunningdave

+0

Parece que fue eso! Los errores ya no aparece. Pensé que tenía algo que ver con el alcance, pero no encontré un ejemplo claro que me mostrara lo que necesitaba. ¡Gracias! – isorfir

6

parece como si estuviera vinculante sus ItemsSource listviews a un objeto, no una matriz. ¿todo está funcionando visualmente? o ¿no ves nada?

EDITAR: lo que sucede si se escribe en lugar de:

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

esto:

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

o cualquier definición recogida asimismo

+0

@isorfir actualizó mi respuesta para reflejar lo que decía antes ... –

+0

Debería haber mencionado que todo funciona correctamente, pero estos errores existen independientemente. Recibo este error cuando uso su código: "La operación no es válida mientras ItemsSource está en uso.Acceda y modifique elementos con ItemsControl.ItemsSource en su lugar. " – isorfir

+0

@isorfir eso es lo que buscaba con mi pregunta! No se preocupe si ve estos mensajes de error. No son poco comunes. Mientras Bindingengine averigua las cosas, no puede haberlas. errores si algo no está presente a tiempo, pero aún así todo funciona bien –

Cuestiones relacionadas