在’对象’上找不到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’)
- target属性是’Text’(类型’String’)
- target元素是’TextBlock’(Name =”);
- BindingExpression:路径=发件人;
- DataItem =’Char’(HashCode = 6619237);
- 在’对象”’Char’(HashCode = 6619237)’上找不到’Sender’属性。
- BindingExpression路径错误:
- 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
的公共属性,以便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
属性…此信息全部在您的错误中。 但是,它继续表示数据绑定的object
是object
类型,而object
类没有任何名为Sender
属性…因此…错误。
要修复它,请找到TextBlock
和Binding
,并将object
与具有名为Sender
的属性的类的实例交换,或者使用属性绑定到object
类中定义的object
。
根据你所拥有的这些错误的数量来判断,我必须假设它们是由ItemTemplate
的Binding
引起的,例如。 您收集的每个项目都会导致相同的错误。
如果您使用ItemsSource
属性,它假定您传入IEnumerable
。 默认情况下,如果WPF也找不到任何其他有用的东西,它也会将其作为类型的名称。 由于string是IEnumerable
(字符),因此列表项将绑定对象的类型名称传递给ItemTemplate
,因为它是唯一可以理解的“合理”事物。 而且,由于Char类型显然没有Sender和Subject属性,因此您的代码会蓬勃发展 。
作为certificate,比较以下代码的输出和错误消息中的哈希码。
foreach (char c in "Message") { Console.WriteLine(c.GetHashCode()); }
而不是使用ListView
,只需使用堆栈面板,其数据源等于消息,并删除封闭的控件: