我在新的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路径错误:对"对象"""字符"(的HashCode = 5046349)"未找到"主题"属性.BindingExpression:路径=主题; DataItem ='Char'(HashCode = 5046349); target元素是'TextBlock'(Name =''); 目标属性是'文字'(类型'字符串')System.Windows.Data错误:40:BindingExpression路径错误:'对象'上找不到'发件人'属性''字符'(HashCode = 6619237)'.BindingExpression:路径=发件人; DataItem ='Char'(HashCode = 6619237); target元素是'TextBlock'(Name =''); 目标属性是"文本"(类型"字符串")System.Windows.Data错误:40:BindingExpression路径错误:对"对象"""字符"(的HashCode = 6619237)"未找到"主题"属性.BindingExpression:路径=主题; DataItem ='Char'(HashCode = 6619237); target元素是'TextBlock'(Name =''); target属性为'Text'(类型'String')System.Windows.Data错误:40:BindingExpression路径错误:'object'''Char'(HashCode = 7536755)'找不到'Sender'属性.BindingExpression:路径=发件人; DataItem ='Char'(HashCode = 7536755); target元素是'TextBlock'(Name =''); 目标属性是"文本"(类型"字符串")System.Windows.Data错误:40:BindingExpression路径错误:对"对象"""字符"(的HashCode = 7536755)"未找到"主题"属性.BindingExpression:路径=主题; DataItem ='Char'(HashCode = 7536755); target元素是'TextBlock'(Name =''); target属性为'Text'(类型'String')System.Windows.Data错误:40:BindingExpression路径错误:'object'''Char'(HashCode = 7536755)'找不到'Sender'属性.BindingExpression:路径=发件人; DataItem ='Char'(HashCode = 7536755); target元素是'TextBlock'(Name =''); 目标属性是"文本"(类型"字符串")System.Windows.Data错误:40:BindingExpression路径错误:对"对象"""字符"(的HashCode = 7536755)"未找到"主题"属性.BindingExpression:路径=主题; DataItem ='Char'(HashCode = 7536755); target元素是'TextBlock'(Name =''); target属性为'Text'(类型'String')System.Windows.Data错误:40:BindingExpression路径错误:'object'''Char'(HashCode = 6357089)'找不到'Sender'属性.BindingExpression:路径=发件人; DataItem ='Char'(HashCode = 6357089); target元素是'TextBlock'(Name =''); 目标属性是"文本"(类型"字符串")System.Windows.Data错误:40:BindingExpression路径错误:对"对象"""字符"(的HashCode = 6357089)"未找到"主题"属性.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 =''); 目标属性是'文字'(类型'字符串')System.Windows.Data错误:40:BindingExpression路径错误:'对象'上找不到'发件人'属性''字符'(HashCode = 6619237)'.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为BGWorker.
这个错误究竟意味着什么,我该怎么做才能摆脱它?
代码隐藏:
public partial class MainWindow : Window
{
public BackgroundWorker worker = new BackgroundWorker();
public ObservableCollection<Message> messages = new ObservableCollection<Message>();
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.";
}
}
Run Code Online (Sandbox Code Playgroud)
XAML:
<ScrollViewer ScrollViewer.CanContentScroll="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ListView x:Name="list" ItemsSource="{Binding Source=Message}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="{x:Null}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
<TextBlock x:Name="senderLabel" Text="{Binding Sender}" HorizontalAlignment="Stretch" TextTrimming="WordEllipsis" TextWrapping="Wrap" FontWeight="SemiBold" />
<TextBlock x:Name="subjectLabel" Text="{Binding Subject}" HorizontalAlignment="Stretch" TextTrimming="WordEllipsis" TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
Rac*_*hel 38
这是一个DataBinding错误
读取它们的最简单方法是用冒号/冒号分解它,然后向后读取它
System.Windows.Data错误:40:BindingExpression路径错误:'对象'''Char'(HashCode = 6619237)'上找不到'Sender'属性.BindingExpression:路径=发件人; DataItem ='Char'(HashCode = 6619237); target元素是'TextBlock'(Name =''); target属性是'Text'(类型'String')
1告诉您有一个Text属性导致错误
2告诉您Text属性在<TextBlock>元素上
3告诉你导致问题的绑定表达 {Binding Path=Sender}
4告诉你<TextBlock>元素后面的DataItem/DataContext 是一个数据类型的项Char
5告诉你这个实际问题:在Sender类型的对象上没有命名的属性Char
6只是告诉你这是一个绑定错误
因为我看到你有一个名为公共财产Sender在你的Message类,它清楚地表明Message不Char,它的明显,您的DataContext每个项目是错误的.
由于它被设置为Char最可能的原因是您绑定到一个字符串,并且DataContext每个元素都是该字符串中的一个字符.
当然,这ItemsSource="{Binding Source=Messages}意味着你要将绑定的Source属性从当前DataContext更改为a string.字符串只是字符数组,因此它意味着您绑定到字符数组{ M, e, s, s, a, g, e, s }
如果您将Source属性更改为属性Path,那么它将正确读取DataContext.Messages,并应该工作.
<ListView ItemsSource="{Binding Path=Messages}" ... />
Run Code Online (Sandbox Code Playgroud)
(Path此处的单词是可选的,因为如果您未指定属性名称,则绑定假定它是Path属性的值)
DataContext在表格上的任何地方设置,我也没有看到公共Messages财产.
该MainWindow构造也许应该有一个行代码,看起来像这样设置DataContext本身:
this.DataContext = this;
Run Code Online (Sandbox Code Playgroud)
你可能需要一个公共属性,ObservableCollection<Message> messages所以ListView绑定可以找到它:
public ObservableCollection<Message> Messages
{
get { return messages; }
set { messages = value; }
}
Run Code Online (Sandbox Code Playgroud)
我不确定这些是否仅仅被忽视,或者如果你不知道你需要它们.
哦,如果您计划更改任何这些绑定属性并让UI自动更新,您还需要实现INotifyPropertyChanged :)
因为我在这里处于教程模式,我想我也应该链接到这个答案:
如果您不熟悉WPF的工作方式,并且正在从Winforms切换到WPF,我强烈建议您阅读它(以及链接的文章).这听起来像你是:)
| 归档时间: |
|
| 查看次数: |
28111 次 |
| 最近记录: |