Проблемы с привязкой WPF, если не задан DataContext - PullRequest
0 голосов
/ 28 ноября 2010

Я успешно создал несколько UserControls с различными функциями, установив DataContext для каждого элемента управления в «this». У меня всегда были проблемы при попытке разделить их на меньшие «внутренние» пользовательские элементы управления, которые будут более полезными. Проблема заключается в следующем:

Когда для DataContext установлено значение «this», я могу связываться со свойствами в коде позади - они не обязательно должны быть DependencyProperties. При привязке к обычным свойствам выполнение программы вводит код, где я могу делать такие вещи, как переключение элементов ListBox или другие вещи, которые я не могу сделать в xaml.

Но когда я создаю новый 'внутренний' UserControl, который размещен в исходном элементе управления, и перемещаю эти свойства во внутренний элемент управления, мне теперь нужно обновить их до DependencyProperties, чтобы я мог связываться с ними из исходного элемента управления , При связывании с DependencyProperties выполнение программы никогда не входит в код, и для меня ЭТО проблема. Кстати, я не устанавливаю DataContext во внутреннем элементе управления, а вместо этого устанавливаю свойство Name корневого элемента и использую синтаксис ElementName = UserControlName в привязке свойств внутреннего элемента управления.

Мне известно, что я могу добавить ValidateValueCallbackHandler в DependencyProperty, чтобы получить доступ к коду после изменения связанного значения, но это должен быть статический метод, поэтому я не могу получить доступ к любым нестатическим элементам (т. Е. Моим весь класс).

Одним из примеров является то, что у меня есть элемент управления DurationPicker, который отображает объекты TimeSegments в ListBoxes. Объекты TimeSegments в основном представляют собой ObservableCollection объектов TimeSegment, а TimeSegment имеет свойства StartDate, EndDate и Duration. У меня есть свойство MinutesPerSegment в элементе управления DurationPicker, которое было привязано к значениям из ComboBox. Это сработало отлично. Я мог бы изменить значение ComboBox, и в коде было бы правильное количество объектов TimeSegment с правильными новыми значениями в ListBox.

Затем я создал внутренний элемент управления, который содержит объект TimeSegments и ListBox для его отображения. Теперь свойство MinutesPerSegment должно было стать объектом DependencyProperty, чтобы я мог связываться с ним из внешнего элемента управления, и выполнение программы никогда не вводит код позади, поэтому теперь я не могу изменить количество объектов TimeSegmentobject в коллекции.

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

Как правильно это сделать? Большое спасибо.

РЕДАКТИРОВАТЬ - В этом примере, если я создаю объекты TimeSegments во внешнем элементе управления и связываю их с внутренним элементом управления, он все равно работает. Это связано с тем, что свойство MinutesPerSegment во внешнем элементе управления является обычным свойством ... Однако я хочу, чтобы каждый объект TimeSegments обрабатывался в своем собственном внутреннем элементе управления TimeSegmentsRow ... и поэтому проблема.

1 Ответ

0 голосов
/ 28 ноября 2010

Во-первых, вам не нужно устанавливать DataContext в this только для того, чтобы включить привязку к свойствам вашего пользовательского элемента управления.Это плохая идея, если кто-то решит установить другой текстовый текст для вашего контроля.Вместо этого вы можете использовать относительную привязку.

{Binding Path=PathToProperty, 
         RelativeSource={RelativeSource AncestorType=
                         {x:Type namespaceAlias:typeOfYourControl}}}

и объявите псевдоним пространства имен для своего пользовательского элемента управления в xaml

xmlns:namespaceAlias="clr-namespace:YourLibraryNamespace;assembly=YourLibraryAssemblyName"

Во-вторых, wpf не будет использовать ваш метод получения и установки свойств для доступа к вашим свойствам зависимости Вот почему не должно быть никакой дополнительной логики, кроме GetValue и SetValue.Вы можете указать PropertyChangedCallback при регистрации вашего свойства, чтобы добавить некоторую логику при изменении свойства.

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