Пользовательские свойства зависимостей и привязка TwoWay в WPF - PullRequest
7 голосов
/ 29 апреля 2009

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

Что я здесь не так делаю? Это должно быть действительно простым делом, но это не вызывает у меня головной боли.

Ответы [ 2 ]

11 голосов
/ 29 апреля 2009

Это ожидаемое поведение. Свойство CLR - это просто оболочка вокруг базового DependencyProperty. WPF часто оптимизирует, вызывая GetValue и SetValue напрямую. Если вам нужна пользовательская логика для выполнения, используйте метаданные DependencyProperty.

2 голосов
/ 29 июня 2011

После этого выпуска мне понадобилось некоторое время:

Для тех из вас, у кого такая же проблема, но, как и я, не видите решения в ответе выше:

Для поддержки наследования DataContext пользовательский класс (в данном случае Context) должен быть получен из FrameworkElement , а не DependencyObject . Вот и все.

Марк

...