2009-03-10 11 views
4

Ich habe versucht, eine Auflistung meiner W3CError-Typobjekte an ein WPF-ListView-Steuerelement zu binden..NET WPF XAML "BindingExpression Pfadfehler: ... Eigenschaft nicht gefunden"

Es war eine nette kleine 13 Linienklasse ...

 
Class W3CError 

    Public Type As ErrorOrWarning 
    Public Line As Integer 
    Public Col As Integer 
    Public Message As String 
    Public MessageId As String 
    Public Explanation As String 
    Public Source As String 

    Enum ErrorOrWarning 
     ValidationError 
     ValidationWarning 
    End Enum 

End Class 

Es hat nicht funktioniert. Ich habe diese verbindlichen Fehler in Visual Studio-Ausgabefenster:

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

Nun, nein, das ist keine Eigenschaft. Es ist einfach öffentlich. Ich denke, das ist nicht gut genug für WPF-Bindung?

Ich habe es durch eine Verlängerung meiner Klasse zu einer hässlichen 69 Linien von Eigenschaften vorformulierten zu arbeiten ...

 
Class W3CError 

    Private _Type As ErrorOrWarning 
    Private _Line As Integer 
    Private _Col As Integer 
    Private _Message As String 
    Private _MessageId As String 
    Private _Explanation As String 
    Private _Source As String 

    Enum ErrorOrWarning 
     ValidationError 
     ValidationWarning 
    End Enum 

    Public Property Type() As ErrorOrWarning 
     Get 
      Return _Type 
     End Get 
     Set(ByVal value As ErrorOrWarning) 
      _Type = value 
     End Set 
    End Property 

    Public Property Line() As Integer 
     Get 
      Return _Line 
     End Get 
     Set(ByVal value As Integer) 
      _Line = value 
     End Set 
    End Property 

    Public Property Col() As Integer 
     Get 
      Return _Col 
     End Get 
     Set(ByVal value As Integer) 
      _Col = value 
     End Set 
    End Property 

    Public Property Message() As String 
     Get 
      Return _Message 
     End Get 
     Set(ByVal value As String) 
      _Message = value 
     End Set 
    End Property 

    Public Property MessageId() As String 
     Get 
      Return _MessageId 
     End Get 
     Set(ByVal value As String) 
      _MessageId = value 
     End Set 
    End Property 

    Public Property Explanation() As String 
     Get 
      Return _Explanation 
     End Get 
     Set(ByVal value As String) 
      _Explanation = value 
     End Set 
    End Property 

    Public Property Source() As String 
     Get 
      Return _Source 
     End Get 
     Set(ByVal value As String) 
      _Source = value 
     End Set 
    End Property 

End Class 

Gibt es einen besseren Weg?

+0

Ahhh ... das ist, warum meine Bindungen nicht funktionierten! Vielen Dank. – Kieron

+0

Ich hoffe, ich habe dir etwas Frustration erspart, Kieron. –

Antwort

4

Wenn Sie C# verwenden, würde ich automatische Eigenschaften verwenden, aber ich glaube nicht, dass sie in VB sind.

Also wahrscheinlich nicht. Sie können sogar noch weiter gehen und Ihre Klasse dazu bringen, INotifyPropertyChanged zu implementieren, damit Ihre Benutzeroberfläche weiß, ob sich die Eigenschaften ändern.

+0

Humbug! Ich würde lieber VB hatte automatische Eigenschaften als Inline-XML. –

+0

Ich glaube, dass die nächste Version von VB (die mit .NET 4.0/Visual Studio 2010 ausgeliefert wird) automatische Eigenschaften haben wird. Es hilft jetzt nicht, aber wenigstens wird es schließlich helfen. – Andy

1

würde ich es nicht nennen besser Art und Weise, aber man konnte ICustomTypeDescriptor implementieren und Ihre Felder als gefälschte Eigenschaften durch die GetProperties Verfahren aussetzen. Es würde nur am Ende weniger Code sein, wenn Sie ein paar Dutzend Felder hatten.


Ursprünglich geschrieben von Robert Macnee, aber später entfernt. Restauriert hier, weil es mich interessiert ...