在’对象’上找不到WPF / XAML属性

我在新的WPF应用程序中使用BackgroundWorker,我需要报告进度/更新UI,因为它在后台运行。

我在WIndows Forms应用程序中已经这么做了很长时间。 我刚刚为WPF改写了这一切,这让我有点头疼。

它在运行时不断抛出以下错误:

System.Windows.Data错误:40:BindingExpression路径错误:’object”’Char’(HashCode = 5046349)’上找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 5046349); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:在’对象”’Char’(HashCode = 5046349)’上找不到’主题’属性。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 5046349); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 6619237)’找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 6619237); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:在’对象”’Char’(HashCode = 6619237)’上找不到’主题’属性。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 6619237); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 7536755)’找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 7536755); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:在’对象”’Char’(HashCode = 7536755)’上找不到’主题’属性。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 7536755); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 7536755)’找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 7536755); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:在’对象”’Char’(HashCode = 7536755)’上找不到’主题’属性。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 7536755); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 6357089)’上找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 6357089); target元素是’TextBlock’(Name =”); 目标属性是’文本’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’找不到”””””””””””””””””””””””””””””””””’ BindingExpression:路径=主题; DataItem =’Char’(HashCode = 6357089); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 6750311)’找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 6750311); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:’对象’上没有’主题’属性”字符’(HashCode = 6750311)’。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 6750311); target元素是’TextBlock’(Name =”); 目标属性是’Text’(类型’String’)System.Windows.Data错误:40:BindingExpression路径错误:’对象”’Char’(HashCode = 6619237)’找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 6619237); target元素是’TextBlock’(Name =”); 目标属性是’文字’(类型’字符串’)System.Windows.Data错误:40:BindingExpression路径错误:在’对象”’Char’(HashCode = 6619237)’上找不到’主题’属性。 BindingExpression:路径=主题; DataItem =’Char’(HashCode = 6619237); target元素是’TextBlock’(Name =”); target属性是’Text’(类型’String’)

我不知道这究竟意味着什么。 一些谷歌搜索没有透露任何有用的信息。

我还要指出,如果我不在WPF中使用BGWorker,代码确实可以检索所有邮件。 但它只在我使用后台工作程序时停止工作并停止绑定。 我不知道为什么。 完全相同的代码适用于WinForms for BGWorker。

这个错误究竟意味着什么,我该怎么做才能摆脱它?

代码隐藏:

public partial class MainWindow : Window { public BackgroundWorker worker = new BackgroundWorker(); public ObservableCollection messages = new ObservableCollection(); public MailMessage msg; int count = 0; public class Message { public string Sender { get; set; } public string Subject { get; set; } public string Content { get; set; } public DateTime DateReceived { get; set; } public DateTime DateRead { get; set; } public MailMessage Mail { get; set; } } public MainWindow() { InitializeComponent(); worker.WorkerSupportsCancellation = true; worker.WorkerReportsProgress = true; worker.ProgressChanged += Worker_ProgressChanged; worker.RunWorkerCompleted += Worker_RunWorkerCompleted; worker.DoWork += Worker_DoWork; } private void RetrieveMessages() { // Working code. using (var imap = new AE.Net.Mail.ImapClient()) { for(int i = 0; i < count; i++) { MailMessage msg = imap.GetMessage(i, true, false); worker.ReportProgress(i); } } } private void Worker_DoWork(object sender, DoWorkEventArgs e) { if(count != 0) RetrieveMessages(); else { using(var imap = new AE.Net.Mail.ImapClient()) { count = imap.GetMessageCount("Inbox"); } } } private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { status.Text = "Status: Idle."; list.ItemsSource = messages; } private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine(msg.Sender.Address + " " + msg.Subject); MessageBox.Show(msg.Subject); if(msg != null) { messages.Add(new Message() { Sender = "hi", Subject = msg.Subject, Content = msg.Body, Mail = msg }); msg = null; } } private void Window_Loaded(object sender, RoutedEventArgs e) { // DEBUG ONLY worker.RunWorkerAsync(); status.Text = "Status: Synchronizing."; } } 

XAML:

              

这是一个DataBinding错误

读取它们的最简单方法是用冒号/冒号分解它,然后向后读取它

System.Windows.Data错误:40:BindingExpression路径错误:’object”’Char’(HashCode = 6619237)’上找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 6619237); target元素是’TextBlock’(Name =”); target属性是’Text’(类型’String’)

  1. target属性是’Text’(类型’String’)
  2. target元素是’TextBlock’(Name =”);
  3. BindingExpression:路径=发件人;
  4. DataItem =’Char’(HashCode = 6619237);
  5. 在’对象”’Char’(HashCode = 6619237)’上找不到’Sender’属性。
  6. BindingExpression路径错误:
  7. System.Windows.Data错误:40:

1告诉您有一个Text属性导致错误

2告诉您Text属性位于元素上

3告诉你导致问题的绑定表达是{Binding Path=Sender}

4告诉您元素后面的DataItem / DataContext是数据类型Char

5告诉你这个问题的实际问题:在Char类型的对象上没有名为Sender的属性

6只是告诉你这是一个绑定错误

7我不知道这意味着什么

因为我看到你的Message类上有一个名为Sender的公共属性,并且明确Message不是Char ,显然你的每个项的DataContext都是错误的。

由于它被设置为Char因此最可能的原因是您绑定到字符串,并且每个元素的DataContext是该字符串中的字符。

果然, ItemsSource="{Binding Source=Messages}意味着您正在将绑定的Source属性从当前的DataContext更改为string 。而字符串只是字符数组,因此它意味着您绑定到字符数组{ M, e, s, s, a, g, e, s }

如果将Source属性更改为Path属性,则它将正确读取DataContext.Messages ,并且应该可以正常工作。

  

(此处的“ Path ”一词是可选的,因为如果您未指定属性名称,则绑定假定它是“ Path属性的值)


作为旁注,我没有看到你在表单上的任何地方设置DataContext ,我也没有看到公共Messages属性。

MainWindow构造函数可能应该有一行代码,将DataContext设置为自身:

 this.DataContext = this; 

并且您可能需要ObservableCollection messages的公共属性,以便ListView绑定可以找到它:

 public ObservableCollection Messages { get { return messages; } set { messages = value; } } 

我不确定这些是否仅仅被忽视,或者如果你不知道你需要它们。

哦,如果您打算更改任何这些绑定属性并让UI自动更新,您也需要实现INotifyPropertyChanged 🙂

由于我在这里处于教程模式,我想我也应该链接到这个答案:

从Windows窗体转换为WPF

如果您对WPF的工作方式不熟悉,并且正在从Winforms切换到WPF,我强烈建议您阅读它(以及链接的文章)。 这听起来像你是:)

与许多.NET错误不同,这些错误意味着他们所说的……你所要做的就是阅读它们。 以此为例:

System.Windows.Data错误:40:BindingExpression路径错误:’object”’Char’(HashCode = 5046349)’上找不到’Sender’属性。 BindingExpression:路径=发件人; DataItem =’Char’(HashCode = 5046349); target元素是’TextBlock’(Name =”); target属性是’Text’(类型’String’)

在XAML中的某个位置,您尝试将名为Sender的属性数据绑定到TextBlock.Text属性…此信息全部在您的错误中。 但是,它继续表示数据绑定的objectobject类型,而object类没有任何名为Sender属性…因此…错误。

要修复它,请找到TextBlockBinding ,并将object与具有名为Sender的属性的类的实例交换,或者使用属性绑定到object类中定义的object

根据你所拥有的这些错误的数量来判断,我必须假设它们是由ItemTemplateBinding引起的,例如。 您收集的每个项目都会导致相同的错误。

如果您使用ItemsSource属性,它假定您传入IEnumerable 。 默认情况下,如果WPF也找不到任何其他有用的东西,它也会将其作为类型的名称。 由于string是IEnumerable (字符),因此列表项将绑定对象的类型名称传递给ItemTemplate ,因为它是唯一可以理解的“合理”事物。 而且,由于Char类型显然没有Sender和Subject属性,因此您的代码会蓬勃发展

作为certificate,比较以下代码的输出和错误消息中的哈希码。

 foreach (char c in "Message") { Console.WriteLine(c.GetHashCode()); } 

而不是使用ListView ,只需使用堆栈面板,其数据源等于消息,并删除封闭的控件: