У меня есть я в тупике. У нас есть пользовательский элемент ItemsControl, который использует как пользовательские контейнеры, так и пользовательскую панель в качестве ItemsHost. Теперь панель имеет некоторые показатели, необходимые контейнерам для целей рендеринга. Поскольку они являются прямыми дочерними элементами панели в визуальном дереве, вы можете подумать, что свойство Parent контейнера вернет панель, но это не так!
Я также подтвердил эту точную вещь, используя Snoop на стандартном ListBox, поэтому это не является исключением для нашего кода, но, видимо, все контейнеры ItemsControls.
Теперь я знаю, что я могу использовать VisualTreeHelper для получения визуального родителя (это то, что мне нужно), но почему родительский элемент не был панелью?
Если аргумент состоит в том, что панель является просто частью визуального дерева, а родитель зарезервирован для логического дерева, то разве родительский элемент не был бы ItemControl?
Если аргумент есть контейнер, также является частью визуального дерева ItemsControl, а не логическим деревом, то почему содержимое, помеченное в контейнере, возвращает контейнер в качестве свойства родителя?
Это означает, что если вы идете по логическому дереву из элемента данных, вы останавливаетесь в контейнерах, что может объяснить, почему наши привязки из контейнеров к панелям не работают должным образом. (Я считаю, что привязки основаны на логической иерархии, а не на визуальной, но я должен был бы проверить, чтобы убедиться.)