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

jay*_*t55 11 .net c# 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路径错误:对"对象"""字符"(的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. 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属性在<TextBlock>元素上

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

4告诉你<TextBlock>元素后面的DataItem/DataContext 是一个数据类型的项Char

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

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

7我不知道这意味着什么

因为我看到你有一个名为公共财产Sender在你的Message类,它清楚地表明MessageChar,它的明显,您的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 :)

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

从Windows窗体转换为WPF

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

  • @Aeron这些错误与后台工作程序无关,它们是通用的XAML绑定错误.当你写一个``Binding}`时,默认情况下`Source`设置为`DataContext`,`Path`设置为`Source`.当您编写`ItemsSource ="{Binding Source = Messages}`时,您正在将该绑定的`Source`从当前的`DataContext`更改为一串``Messages``,而一个字符串只不过是一个字符所以你将`ListView`绑定到`{M,e,s,s,a,g,e,s}`的字符数组,每个`ListViewItem`都有一个`DataContext`,其中一个字符 (2认同)