Пользовательские свойства зависимостей и двусторонняя привязка в WPF
-
03-07-2019 - |
Вопрос
У нас есть объект, производный от DependencyObject, и реализующий некоторые DependencyProperties.
В основном что-то вроде этого:
class Context : DependencyObject {
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata (""));
public string Name {
get {
return (string)this.GetValue (NameProperty);
}
set {
this.SetValue (NameProperty, value);
}
}
}
Это работает, свойство настроено, может быть привязано и т. д.Проблема возникает, когда я привязываю TO к свойству из WPF, используя привязку TwoWay.Часть TwoWay на самом деле никогда не происходит, WPF никогда не вызывает набор этого свойства.Я настроил привязку следующим образом:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
В этом случае ввод в текстовое поле должен немедленно обновить свойство Name, но этого не происходит.Если я изменю свойство Name на обычное свойство POCO, оно будет работать (хотя другая сторона TwoWay, очевидно, не будет работать, если я не реализую INotifyPropertyChanged).
Что я здесь делаю не так?Это должно быть очень просто, но это вызывает у меня бесконечные головные боли.
Решение
Это ожидаемое поведение.Свойство CLR — это просто оболочка базового DependencyProperty
.WPF часто оптимизирует, вызывая GetValue
и SetValue
напрямую.Если вам нужна пользовательская логика для выполнения, используйте метаданные файла DependencyProperty
.
Другие советы
После того, как эта проблема стоила мне некоторого времени:
Для тех из вас, у кого такая же проблема, но, как и у меня, не видите решения в ответе выше:
Чтобы поддерживать наследование DataContext, пользовательский класс (в данном случае Context) должен быть производным от FrameworkElement скорее, чем Объект зависимости.Вот и все.
Марк