PropertyChanged всегда null C # WPF [дубликат]

Идиома Python для этого - newList = oldList[:]

8
задан jay_t55 3 July 2014 в 16:56
поделиться

3 ответа

Это ошибка DataBinding

. Самый простой способ прочитать их - разбить его на двоеточие / полуколоны и прочитать его назад

System.Windows. Ошибка данных: 40: Ошибка пути BindingExpression: свойство 'Sender' не найдено в 'object' '' Char '(HashCode = 6619237)'. BindingExpression: Path = Sender; DataItem = 'Char' (HashCode = 6619237); целевым элементом является «TextBlock» (Name = ''); target свойство is 'Text' (type 'String')

  1. target свойство is 'Text' (type 'String')
  2. target element is 'TextBlock '(Name =' ');
  3. BindingExpression: Path = Sender;
  4. DataItem = 'Char' (HashCode = 6619237);
  5. Свойство «Отправитель» не найдено в 'object' '' Char '(HashCode = 6619237)'.
  6. Ошибка пути BindingExpression:
  7. Ошибка System.Windows.Data: 40:

1 сообщает вам, что существует свойство Text, вызывающее ошибка

2 говорит вам, что свойство Text находится на элементе <TextBlock>

3, сообщает вам, что проблема связи является причиной проблемы {Binding Path=Sender}

4 говорит вам, что DataItem / DataContext за элементом <TextBlock> является элементом типа данных Char

5, который указывает на фактическую проблему: нет свойства с именем Sender на объекте type Char

6 просто говорит вам, что это ошибка привязки

7 У меня нет , что это значит

Поскольку I см., что у вас есть общедоступное свойство с именем Sender в вашем классе Message, и ясно, что Message не Char, его очевидно, что ваш DataContext для каждого элемента неверен.

Поскольку он установлен в Char, наиболее вероятной причиной является привязка к строке, а DataContext для каждого элемента - символ в этой строке.

И, конечно, ItemsSource="{Binding Source=Messages} означает, что вы меняете binding Source от текущего 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. Кажется, что вы:)

34
ответ дан Community 22 August 2018 в 03:30
поделиться
  • 1
    Так что, действительно, я до сих пор не знаю, почему он жалуется на это. Тип, который я передаю, это string, поэтому я не знаю, почему это говорит мне, что это char. Я думаю, что это имеет какое-то отношение к BackgroundWorker. Единственная причина, по которой я думаю, это потому, что тот же код отлично работает без BGWorker. Использовали ли вы BackgroundWorker, когда вы получили эту ошибку @Rachel? – jay_t55 3 July 2014 в 17:13
  • 2
    @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 одного из символов – Rachel 3 July 2014 в 17:20
  • 3
    @Aeron См. Обновления к моему ответу :) – Rachel 3 July 2014 в 17:44
  • 4
    & quot; this.DataContext = this; & quot ;, oh my ... Почему f *** не является поведением по умолчанию ??? – Camilo Terevinto 20 July 2017 в 11:25
  • 5
    @CamiloTerevinto На самом деле очень плохой дизайн, чтобы писать this.DataContext = this в большинстве случаев, потому что данные предназначены для того, чтобы предоставить тот, кто использует этот элемент управления. Такое жесткое кодирование нарушает разделение данных и пользовательского интерфейса и поражает одно из самых больших преимуществ WPF наличия «безостановочных элементов управления». Единственный раз, когда это имеет смысл, это элементы управления, которые предназначены для определения и использования только собственных данных или при тестировании. – Rachel 20 July 2017 в 19:08
2
ответ дан Clever Neologism 22 August 2018 в 03:30
поделиться

В отличие от многих ошибок .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')

Где-то в вашем XAML вы пытаетесь привязать данные к имени с именем Sender к свойству TextBlock.Text ... это информация все в вашей ошибке. Тем не менее, он продолжает, что объект, связанный с данными, имеет тип object, а класс object не имеет никакого свойства с именем Sender ... поэтому ... ошибка.

Чтобы исправить это , найдите TextBlock и Binding и замените object экземпляром вашего класса, который имеет , свойство с именем Sender или, альтернативно, использует свойство для привязки к этому является , определенным в классе object.

Судя по количеству этих ошибок, которые у вас есть, я должен предположить, что они вызваны Binding в ItemTemplate, например. у вас есть такая же ошибка, вызванная каждым элементом вашей коллекции.

4
ответ дан Sheridan 22 August 2018 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: