Успешно създадох редица потребителски контроли с различна функционалност, настройвайки DataContext на всяка контрола на „това“. Винаги съм имал проблеми, когато се опитвах да ги разделя на по-малки „вътрешни“ потребителски контроли, които ще бъдат по-използваеми. Проблемът е следният:
Когато 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, за да мога да се обвържа с него от външния контрол и изпълнението на програмата никога не въвежда кода отзад, така че сега не мога да променя броя на TimeSegmentobjects в колекцията.
Още нещо, което трябва да отбележим. Мога успешно да се свържа с DependencyProperties на вътрешния контрол от външния контрол - мога да видя промените, показващи се в потребителския интерфейс. Проблемът е просто, че имам нужда от изпълнение на програмата, за да въведа кода зад нея, когато определени обвързани свойства се актуализират.
Какъв е правилният начин да направите това? Много благодаря.
РЕДАКТИРАНЕ - В примера, ако създам обектите TimeSegments във външния контрол и ги обвържа с вътрешния контрол, тогава той все още работи. Това е така, защото свойството MinutesPerSegment във външната контрола е обикновено свойство... Искам обаче всеки обект TimeSegments да се обработва в собствената му вътрешна контрола TimeSegmentsRow... и така проблемът.