Пользовательские свойства зависимостей и двусторонняя привязка в WPF

StackOverflow https://stackoverflow.com/questions/803361

Вопрос

У нас есть объект, производный от 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 скорее, чем Объект зависимости.Вот и все.

Марк

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top