Пользовательский TypeDescriptor и AddValueChange / OnValueChanged - PullRequest
0 голосов
/ 07 февраля 2019

Я исследую использование пользовательского TypeDescriptors для перехвата, когда свойство с привязкой к данным в элементе управления WPF устанавливает свойство CLR.По причинам, мне необходимо выяснить, какой именно элемент управления устанавливает значение.

Если я использую INotifyPropertyChanged, я получу все различные элементы управления, которые подписываются на любое свойство в моей модели представления, а не все, чтополезно.Поэтому я решил пойти по пользовательскому пути TypeDescriptor и попробовать пути ProperyDescriptor.AddValueChanged и PropertyDescriptor.OnValueChanged.

Я вижу, что WPF вызывает ProperyDescriptor.AddValueChanged, как и ожидалось, но мой вызов ProperyDescriptor.OnValueChanged кажется, что никогда не запускается вызов PropertyDescriptor.GetValue и обновление в пользовательском интерфейсе.

Есть ли какие-то ошибки при использовании этого материала, который я пропускаю?Или есть другие способы выяснить, кто подписывается на свойство CLR.Моя альтернатива, как я вижу это сейчас, - это создание собственного прокси для всего шебанга, но я бы очень хотел, чтобы этого не делали.

Редактировать: Глядя немного ближе, я заметил, чтоделегаты, которых я получаю через PropertyDescriptor.AddValueChanged, идут в какой-то внутренний вспомогательный класс MS, поэтому без некоторого ненадежного отражения-фу нет способа использовать это для получения контроля над исходным кодом.Я думаю, мне придется использовать собственный прокси со свойствами зависимостей.

1 Ответ

0 голосов
/ 07 февраля 2019

Есть альтернатива, которая может быть полезной.В привязке вы можете установить NotifyOnSourceUpdated в True, что вызовет событие SourceUpdated элемента управления, когда WPF обновит свойство CLR, к которому он привязан.Например, в TextBox вы можете написать:

<TextBox
    Text="{Binding MyText, NotifyOnSourceUpdated=True}"
    SourceUpdated="TextBox_OnSourceUpdated"
    />

В выделенном фрагменте кода вы можете получить точный элемент управления (sender) и имя свойства зависимостей, которое обновило CLRсвойство:

private void TextBox_OnSourceUpdated(object sender, DataTransferEventArgs e)
{
    var control = (TextBox)sender;
    var propertyName = e.Property.Name;
}

При использовании этого метода вам нужно знать, что элемент управления был TextBox, но вы, вероятно, можете обновить его для проверки различных типов элементов управления.На самом деле это зависит от того, для чего вам это нужно.

...