Метод обратного вызова DependencyProperty не вызван
-
06-07-2019 - |
Вопрос
Я создаю UserControl (TableWithFilter.xaml) со свойством зависимости (источник). UserControl - это таблица с исходным свойством для различных элементов. Я создал XAML и установил свойство источника с помощью привязки XAML. Пока все хорошо.
Но если значение свойства зависимости изменяется, определенный метод обратного вызова не вызывается. Поэтому я не могу обновить записи в моей таблице. Кто-нибудь знает, почему метод обратного вызова не вызывается?
Вот определение моего свойства в классе " TableWithFilter "
Public Shared ReadOnly SourceProperty As DependencyProperty = _
DependencyProperty.Register("Source", GetType(List(Of TableViewItem)), GetType(TableWithFilter), _
New FrameworkPropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf TableWithFilter.ChangeSource)))
и метод обратного вызова:
Private Shared Sub ChangeSource(ByVal source As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
Dim table As TableWithFilter = source
table.Source = e.NewValue
End Sub
и здесь XAML:
<Border Grid.Row="1" Grid.Column="1" BorderBrush="{StaticResource ElementBorder}" BorderThickness="1">
<local:TableWithFilter x:Name="SearchResultTable" Source="{Binding Source={StaticResource contentFacade}, Path=ContentList}" />
</Border>
Если атрибут " ContentList " изменяется, я полагаю, что " ChangeSource " метод в классе TableWithFilder вызывается. Но это не так. После того как я изменил атрибут ContentList, я вызываю следующее событие:
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("ContentList"))
Спасибо за любые идеи.
Решение
Существует разница между изменением всего свойства (т. е. новой ссылки на указанную коллекцию) и изменением содержимого самого списка. Коллекции имеют собственный интерфейс уведомлений об изменениях, который называется INotifyCollectionChanged. код>
. Поэтому вам нужно будет прослушать изменение свойства, которое у вас есть, и внутри него перехватить события INotifyCollectionChanged
в новом экземпляре коллекции, а затем ответить на них.