Я успешно создал несколько 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 ... и поэтому проблема.