Это ошибка DataBinding
. Самый простой способ прочитать их - разбить его на двоеточие / полуколоны и прочитать его назад
System.Windows. Ошибка данных: 40: Ошибка пути BindingExpression: свойство 'Sender' не найдено в 'object' '' Char '(HashCode = 6619237)'. BindingExpression: Path = Sender; DataItem = 'Char' (HashCode = 6619237); целевым элементом является «TextBlock» (Name = ''); target свойство is 'Text' (type 'String')
blockquote>
- target свойство is 'Text' (type 'String')
- target element is 'TextBlock '(Name =' ');
- BindingExpression: Path = Sender;
- DataItem = 'Char' (HashCode = 6619237);
- Свойство «Отправитель» не найдено в 'object' '' Char '(HashCode = 6619237)'.
- Ошибка пути BindingExpression:
- Ошибка System.Windows.Data: 40:
1 сообщает вам, что существует свойство
Text
, вызывающее ошибка2 говорит вам, что свойство Text находится на элементе
<TextBlock>
3, сообщает вам, что проблема связи является причиной проблемы
{Binding Path=Sender}
4 говорит вам, что DataItem / DataContext за элементом
<TextBlock>
является элементом типа данныхChar
5, который указывает на фактическую проблему: нет свойства с именем
Sender
на объекте typeChar
6 просто говорит вам, что это ошибка привязки
7 У меня нет , что это значит
Поскольку I см., что у вас есть общедоступное свойство с именем
Sender
в вашем классеMessage
, и ясно, чтоMessage
неChar
, его очевидно, что вашDataContext
для каждого элемента неверен.Поскольку он установлен в
Char
, наиболее вероятной причиной является привязка к строке, аDataContext
для каждого элемента - символ в этой строке.И, конечно,
ItemsSource="{Binding Source=Messages}
означает, что вы меняете bindingSource
от текущегоDataContext
доstring
. Строки - это только массивы символов, поэтому это означает, что вы привязываетесь к массиву символов{ M, e, s, s, a, g, e, s }
Если вы измените свойство
Source
на свойствоPath
, он будет правильно читатьDataContext.Messages
вместо этого, и должен работать.<ListView ItemsSource="{Binding Path=Messages}" ... />
(Слово
Path
здесь необязательно, так как если вы не укажете имя свойства, тогда привязка предполагает, что это значение для свойстваPath
)В качестве побочного примечания я не вижу, что вы устанавливаете свой
DataContext
в любом месте формы, и я не вижу общедоступного свойстваMessages
.Конструктор
MainWindow
должен вероятно, имеет строку кода, которая выглядит так, чтобы установитьDataContext
в себя:this.DataContext = this;
И вам, вероятно, понадобится публичное свойство для вашего
ObservableCollection<Message> messages
, чтобы привязкаListView
могла его найти :public ObservableCollection<Message> Messages { get { return messages; } set { messages = value; } }
Я не уверен, что это было просто упущено, или если вы не знали, что вам нужны были.
О, и если вы планируете изменить какие-либо из этих связанных свойств и автоматически обновить пользовательский интерфейс, вам также понадобится реализовать INotifyPropertyChanged :)
И так как я сейчас в учебном режиме, я решил, что должен также ссылаться на этот ответ:
Переход из Windows Forms в WPF
< / blockquote>Я бы очень рекомендовал прочитать его (и связанные статьи), если вы новичок в работе WPF и переходите от Winforms к WPF. Кажется, что вы:)
В отличие от многих ошибок .NET, они означают точно , что они говорят ... все, что вам нужно сделать, это прочитать их. Используя этот пример в качестве примера:
Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство 'Sender' не найдено в 'object' '' Char '(HashCode = 5046349)' , BindingExpression: Path = Sender; DataItem = 'Char' (HashCode = 5046349); целевым элементом является «TextBlock» (Name = ''); target свойство is 'Text' (type 'String')
blockquote>Где-то в вашем XAML вы пытаетесь привязать данные к имени с именем
Sender
к свойствуTextBlock.Text
... это информация все в вашей ошибке. Тем не менее, он продолжает, что объект, связанный с данными, имеет типobject
, а классobject
не имеет никакого свойства с именемSender
... поэтому ... ошибка.Чтобы исправить это , найдите
TextBlock
иBinding
и заменитеobject
экземпляром вашего класса, который имеет , свойство с именемSender
или, альтернативно, использует свойство для привязки к этому является , определенным в классеobject
.Судя по количеству этих ошибок, которые у вас есть, я должен предположить, что они вызваны
Binding
вItemTemplate
, например. у вас есть такая же ошибка, вызванная каждым элементом вашей коллекции.
string
, поэтому я не знаю, почему это говорит мне, что этоchar
. Я думаю, что это имеет какое-то отношение к BackgroundWorker. Единственная причина, по которой я думаю, это потому, что тот же код отлично работает без BGWorker. Использовали ли вы BackgroundWorker, когда вы получили эту ошибку @Rachel? – jay_t55 3 July 2014 в 17:13{Binding }
, по умолчаниюSource
устанавливается наDataContext
, а дляPath
установлено значениеSource
. Когда вы пишетеItemsSource="{Binding Source=Messages}
, вы меняетеSource
этого связывания с текущегоDataContext
на строку"Messages"
, а строка - не более чем массив символов. Таким образом, вы связываете свойListView
с массивом символов{ M, e, s, s, a, g, e, s }
, и каждыйListViewItem
имеетDataContext
одного из символов – Rachel 3 July 2014 в 17:20this.DataContext = this
в большинстве случаев, потому что данные предназначены для того, чтобы предоставить тот, кто использует этот элемент управления. Такое жесткое кодирование нарушает разделение данных и пользовательского интерфейса и поражает одно из самых больших преимуществ WPF наличия «безостановочных элементов управления». Единственный раз, когда это имеет смысл, это элементы управления, которые предназначены для определения и использования только собственных данных или при тестировании. – Rachel 20 July 2017 в 19:08