WPF Databinding Magic - PullRequest
       13

WPF Databinding Magic

3 голосов
/ 23 марта 2009

У меня есть ObservableCollection , которая привязана к ItemsControl (в основном отображает список).

Foo в основном выглядит следующим образом (есть другие члены, но он не реализует никаких интерфейсов или событий):

class Foo
{
  public string Name { get; set; }
  //...
}

Когда пользователь нажимает на элемент, я открываю диалоговое окно, где пользователь может редактировать свойства Foo (привязанные к небольшой модели представления со свойством Foo для выбранного элемента), Xaml выглядит следующим образом:

<TextBox Text="{Binding Foo.Name,Mode=TwoWay}"
    Grid.Column="1" Grid.Row="0" Margin="2" />

Действительно странная вещь, , когда пользователь редактирует имя, значение в списке изменяется! (не при наборе текста, а после того, как фокус покидает поле)

Как это сделать? Я не реализовал интерфейс INotifyPropertyChanged для объекта Foo!

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


Обновление: спасибо casperOne за ссылку на решение! Я добавлю здесь резюме, если оно будет 404:

[..] на самом деле вы столкнулись с еще одним скрытым аспектом WPF, то есть механизм привязки данных WPF будет привязывать данные к экземпляру PropertyDescriptor, который переносит свойство источника, если исходный объект является простым объектом CLR, и не реализует INotifyPropertyChanged. интерфейс. И механизм привязки данных попытается подписаться на событие измененного свойства с помощью метода PropertyDescriptor.AddValueChanged (). И когда целевой связанный элемент данных изменяет значения свойства, механизм привязки данных вызовет метод PropertyDescriptor.SetValue () для передачи измененного значения обратно в исходное свойство и одновременно вызовет событие ValueChanged для уведомления других подписчиков (в этом случае другие подписчики будут TextBlock в ListBox.

И если вы реализуете INotifyPropertyChanged, вы несете полную ответственность за реализацию уведомления об изменениях в каждом установщике свойств, которые должны быть данными, связанными с пользовательским интерфейсом. В противном случае изменение не будет синхронизировано, как вы ожидаете.

Ответы [ 3 ]

4 голосов
/ 23 марта 2009

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

Так как вы изменили значение свойства Name через текстовое поле, и WPF знает, когда вы изменили это значение, он старается обновить все, что, как он знает, связано с ним.

0 голосов
/ 24 марта 2009

Потому что они привязаны к одному и тому же объекту. Если вы измените привязку на

{Binding Foo.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

тогда они будут синхронизированы, когда пользователь введет текст в поле.

0 голосов
/ 23 марта 2009

Он использует отражение, чтобы установить значение этого свойства. INotifyPropertyChanged требуется только в том случае, если TextBox необходимо информировать об изменении свойства Name класса Foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...