Ich verwende einen BackgroundWorker in einer neuen WPF-App und ich muss den Fortschritt melden / die Benutzeroberfläche aktualisieren, während sie im Hintergrund arbeitet.
Ich mache das schon lange in Windows Forms Apps. Ich habe gerade alles für WPF neu geschrieben und es gibt mir ein bisschen Kopfschmerzen.
Es wirft zur Laufzeit den folgenden Fehler auf:
System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 5046349)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 5046349); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 5046349) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 5046349); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Sender' wurde nicht in 'Objekt' gefunden "Char" (HashCode = 6619237). BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression-Pfadfehler: "Betreff" -Eigenschaft nicht auf "Objekt" "" Char "(HashCode = 6619237) gefunden". BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: Eigenschaft 'Absender' wurde nicht in 'Objekt' gefunden '' Char ' (HashCode = 7536755) '. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Subject' nicht in 'Objekt' gefunden '' Char '(HashCode = 7536755)'. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 7536755)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 7536755) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Sender' wurde nicht in 'Objekt' gefunden '' Char '(HashCode = 6357089)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6357089); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression-Pfadfehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 6357089) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6357089); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: Eigenschaft 'Absender' wurde nicht in 'Objekt' gefunden '' Char ' (HashCode = 6750311) '. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6750311); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Subject' nicht in 'Objekt' gefunden '' Char '(HashCode = 6750311)'. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6750311); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 6619237)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 6619237) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String')
Ich habe keine Ahnung, was das eigentlich bedeutet. Ein paar Google-Suchen haben nichts ergeben, was geholfen hat.
Ich werde auch darauf hinweisen, dass der Code tatsächlich alle Mails abruft, wenn ich den BGWorker in WPF nicht verwende. Aber es hört nur auf zu arbeiten und hört auf zu binden, wenn ich den Hintergrundarbeiter benutze. Ich habe keine Idee warum. Der exakt gleiche Code funktioniert in WinForms für BGWorker.
Was bedeutet dieser Fehler wirklich und was kann ich tun, um ihn los zu werden?
Code-Behind:
%Vor%XAML:
%Vor%Das ist ein DataBinding-Fehler
Der einfachste Weg, diese zu lesen, ist es, sie durch die Doppelpunkte / Semikolons aufzubrechen und rückwärts zu lesen
System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 6619237)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Geben Sie 'String' ein)
1 sagt Ihnen, dass es eine Text
-Eigenschaft gibt, die den Fehler verursacht
2 sagt Ihnen, dass sich die Text-Eigenschaft auf einem <TextBlock>
-Element
3 sagt Ihnen, dass der verbindliche Express das Problem verursacht {Binding Path=Sender}
4 teilt Ihnen mit, dass das DataItem / DataContext hinter dem Element <TextBlock>
ein Element des Datentyps Char
5 sagt Ihnen das eigentliche Problem: Es gibt keine Eigenschaft namens Sender
für das Objekt vom Typ Char
6 sagt Ihnen nur, dass es sich um einen verbindlichen Fehler handelt
7 Ich habe keine Ahnung, was es bedeutet
Da ich sehe, dass Sie eine öffentliche Eigenschaft namens Sender
in Ihrer Message
-Klasse haben und klar ist, dass Message
nicht Char
ist, ist es offensichtlich, dass Ihre DataContext
für jedes Element falsch ist.
Da es auf Char
gesetzt ist, ist die wahrscheinlichste Ursache, dass Sie an eine Zeichenfolge gebunden sind, und DataContext
für jedes Element ist ein Zeichen in dieser Zeichenfolge.
Und tatsächlich, ItemsSource="{Binding Source=Messages}
bedeutet, dass Sie die Source
-Eigenschaft der Bindung von der aktuellen DataContext
in eine string
ändern. Und Zeichenketten sind nur Zeichen-Arrays, das heißt, Sie binden an das Zeichen-Array { M, e, s, s, a, g, e, s }
Wenn Sie die Eigenschaft Source
in die Eigenschaft Path
ändern, wird stattdessen DataContext.Messages
korrekt gelesen und sollte funktionieren.
(Das Wort Path
ist hier optional, da die Bindung annimmt, dass es sich um den Wert für die Path
-Eigenschaft handelt, wenn Sie keinen Eigenschaftsnamen angeben)
Als Nebenbemerkung sehe ich nicht, dass Sie Ihre
DataContext
irgendwo auf dem Formular festlegen, und ich sehe auch keine öffentliche Messages
-Eigenschaft.
Der MainWindow
-Konstruktor sollte wahrscheinlich eine Codezeile haben, die wie folgt aussieht, um DataContext
auf sich selbst zu setzen:
Und Sie benötigen wahrscheinlich eine öffentliche Eigenschaft für Ihr ObservableCollection<Message> messages
, damit die ListView
-Bindung es finden kann:
Ich bin mir nicht sicher, ob diese nur übersehen wurden oder ob Sie nicht wussten, dass Sie sie brauchten.
Oh, und wenn Sie vorhaben, diese gebundenen Eigenschaften zu ändern und die Benutzeroberfläche automatisch aktualisieren zu lassen, sollten Sie INotifyPropertyChanged auch:)
Und da ich hier im Tutorial-Modus bin, dachte ich, ich sollte auch auf diese Antwort verlinken:
>
Ich würde sehr empfehlen, es durchzulesen (und die verknüpften Artikel), wenn Sie neu bei der Funktionsweise von WPF sind und von Winforms zu WPF wechseln. Was es klingt wie du bist:)
Wenn Sie eine Eigenschaft Sender
verwenden, wird davon ausgegangen, dass Sie eine TextBlock.Text
übergeben. WPF wird standardmäßig die Dinge als den Namen ihres Typs anzeigen, wenn sie nichts anderes finden können, was mit etwas zu tun ist. Da string ein object
(von Zeichen) ist, übergibt das Listenelement den Namen des gebundenen Objekttyps an object
, da es die einzige "vernünftige" Sache ist, die es ausführen kann. Und da der Char-Typ offensichtlich keine Sender- und Subjekt-Eigenschaften hat, geht Ihr Code boom .
Vergleichen Sie als Beweis die Ausgabe des unteren Codes und die Hashcodes in Ihren Fehlermeldungen.
%Vor% Verwenden Sie anstelle von Sender
einfach das Stackpanel mit der gleichen Datenquelle wie die Nachricht und löschen Sie die einschließenden Steuerelemente:
Im Gegensatz zu vielen .NET-Fehlern bedeuten diese genau was sie sagen ... alles, was Sie tun müssen, ist sie zu lesen. Verwenden Sie dieses als ein Beispiel:
System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 5046349) '. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 5046349); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String')
Irgendwo in Ihrem XAML versuchen Sie, eine Eigenschaft mit dem Namen TextBlock
an eine Binding
Eigenschaft zu binden. Diese Information steht alles in Ihrem Fehler. Es wird jedoch fortgesetzt, dass das Objekt, das Daten gebunden ist, vom Typ object
ist und dass die Klasse Sender
keine Eigenschaft namens object
... daher ... Fehler hat.
Um es zu beheben, finden Sie die Binding
und die ItemTemplate
und vertauschen die %code% mit einer Instanz Ihrer Klasse, die die Eigenschaft %code% hat, oder alternativ verwenden Eine Eigenschaft zum Binden an ist , die in der Klasse %code% definiert ist.
Nach der Anzahl dieser Fehler, die Sie haben, muss ich annehmen, dass sie von einem %code% in einem %code% verursacht werden, z. Sie haben den gleichen Fehler, der durch jedes Element Ihrer Sammlung verursacht wird.
Das ist ein DataBinding-Fehler
Der einfachste Weg, diese zu lesen, ist es, sie durch die Doppelpunkte / Semikolons aufzubrechen und rückwärts zu lesen
System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 6619237)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Geben Sie 'String' ein)
1 sagt Ihnen, dass es eine %code% -Eigenschaft gibt, die den Fehler verursacht
2 sagt Ihnen, dass sich die Text-Eigenschaft auf einem %code% -Element
befindet3 sagt Ihnen, dass der verbindliche Express das Problem verursacht %code%
ist4 teilt Ihnen mit, dass das DataItem / DataContext hinter dem Element %code% ein Element des Datentyps %code%
ist5 sagt Ihnen das eigentliche Problem: Es gibt keine Eigenschaft namens %code% für das Objekt vom Typ %code%
6 sagt Ihnen nur, dass es sich um einen verbindlichen Fehler handelt
7 Ich habe keine Ahnung, was es bedeutet
Da ich sehe, dass Sie eine öffentliche Eigenschaft namens %code% in Ihrer %code% -Klasse haben und klar ist, dass %code% nicht %code% ist, ist es offensichtlich, dass Ihre %code% für jedes Element falsch ist.
Da es auf %code% gesetzt ist, ist die wahrscheinlichste Ursache, dass Sie an eine Zeichenfolge gebunden sind, und %code% für jedes Element ist ein Zeichen in dieser Zeichenfolge.
Und tatsächlich, %code% bedeutet, dass Sie die %code% -Eigenschaft der Bindung von der aktuellen %code% in eine %code% ändern. Und Zeichenketten sind nur Zeichen-Arrays, das heißt, Sie binden an das Zeichen-Array %code%
Wenn Sie die Eigenschaft %code% in die Eigenschaft %code% ändern, wird stattdessen %code% korrekt gelesen und sollte funktionieren.
%Vor%(Das Wort %code% ist hier optional, da die Bindung annimmt, dass es sich um den Wert für die %code% -Eigenschaft handelt, wenn Sie keinen Eigenschaftsnamen angeben)
Als Nebenbemerkung sehe ich nicht, dass Sie Ihre %code% irgendwo auf dem Formular festlegen, und ich sehe auch keine öffentliche %code% -Eigenschaft.
Der %code% -Konstruktor sollte wahrscheinlich eine Codezeile haben, die wie folgt aussieht, um %code% auf sich selbst zu setzen:
%Vor%Und Sie benötigen wahrscheinlich eine öffentliche Eigenschaft für Ihr %code% , damit die %code% -Bindung es finden kann:
%Vor%Ich bin mir nicht sicher, ob diese nur übersehen wurden oder ob Sie nicht wussten, dass Sie sie brauchten.
Oh, und wenn Sie vorhaben, diese gebundenen Eigenschaften zu ändern und die Benutzeroberfläche automatisch aktualisieren zu lassen, sollten Sie INotifyPropertyChanged auch:)
Und da ich hier im Tutorial-Modus bin, dachte ich, ich sollte auch auf diese Antwort verlinken:
>
Ich würde sehr empfehlen, es durchzulesen (und die verknüpften Artikel), wenn Sie neu bei der Funktionsweise von WPF sind und von Winforms zu WPF wechseln. Was es klingt wie du bist:)
Ich verwende einen BackgroundWorker in einer neuen WPF-App und ich muss den Fortschritt melden / die Benutzeroberfläche aktualisieren, während sie im Hintergrund arbeitet.
Ich mache das schon lange in Windows Forms Apps. Ich habe gerade alles für WPF neu geschrieben und es gibt mir ein bisschen Kopfschmerzen.
Es wirft zur Laufzeit den folgenden Fehler auf:
System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 5046349)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 5046349); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 5046349) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 5046349); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Sender' wurde nicht in 'Objekt' gefunden "Char" (HashCode = 6619237). BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression-Pfadfehler: "Betreff" -Eigenschaft nicht auf "Objekt" "" Char "(HashCode = 6619237) gefunden". BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: Eigenschaft 'Absender' wurde nicht in 'Objekt' gefunden '' Char ' (HashCode = 7536755) '. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Subject' nicht in 'Objekt' gefunden '' Char '(HashCode = 7536755)'. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 7536755)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 7536755) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 7536755); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Sender' wurde nicht in 'Objekt' gefunden '' Char '(HashCode = 6357089)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6357089); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression-Pfadfehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 6357089) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6357089); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: Eigenschaft 'Absender' wurde nicht in 'Objekt' gefunden '' Char ' (HashCode = 6750311) '. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6750311); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String') System.Windows.Data Error: 40: BindingExpression path error: Eigenschaft 'Subject' nicht in 'Objekt' gefunden '' Char '(HashCode = 6750311)'. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6750311); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path error: 'Sender' Eigenschaft nicht gefunden auf 'Objekt' '' Char '(HashCode = 6619237)'. BindingExpression: Pfad = Absender; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String') System.Windows.Data Fehler: 40: BindingExpression path Fehler: 'Betreff'-Eigenschaft nicht gefunden auf' Objekt '' 'Char' (HashCode = 6619237) '. BindingExpression: Pfad = Betreff; DataItem = 'Char' (HashCode = 6619237); Zielelement ist 'TextBlock' (Name = ''); Ziel Eigenschaft ist 'Text' (Typ 'String')
Ich habe keine Ahnung, was das eigentlich bedeutet. Ein paar Google-Suchen haben nichts ergeben, was geholfen hat.
Ich werde auch darauf hinweisen, dass der Code tatsächlich alle Mails abruft, wenn ich den BGWorker in WPF nicht verwende. Aber es hört nur auf zu arbeiten und hört auf zu binden, wenn ich den Hintergrundarbeiter benutze. Ich habe keine Idee warum. Der exakt gleiche Code funktioniert in WinForms für BGWorker.
Was bedeutet dieser Fehler wirklich und was kann ich tun, um ihn los zu werden?
Code-Behind:
%Vor%XAML:
%Vor% Wenn Sie eine Eigenschaft ItemsSource
verwenden, wird davon ausgegangen, dass Sie eine IEnumerable
übergeben. WPF wird standardmäßig die Dinge als den Namen ihres Typs anzeigen, wenn sie nichts anderes finden können, was mit etwas zu tun ist. Da string ein IEnumerable
(von Zeichen) ist, übergibt das Listenelement den Namen des gebundenen Objekttyps an ItemTemplate
, da es die einzige "vernünftige" Sache ist, die es ausführen kann. Und da der Char-Typ offensichtlich keine Sender- und Subjekt-Eigenschaften hat, geht Ihr Code boom .
Vergleichen Sie als Beweis die Ausgabe des unteren Codes und die Hashcodes in Ihren Fehlermeldungen.
%Vor% Verwenden Sie anstelle von ListView
einfach das Stackpanel mit der gleichen Datenquelle wie die Nachricht und löschen Sie die einschließenden Steuerelemente: