Как определить AncestorLevel для RelativeSource в WPF? - PullRequest
0 голосов
/ 14 апреля 2020

В приложении WPF, использующем довольно стандартный шаблон MVVM, мне нужно привязать строку из DataTable (т. Е. Глубоко внутри визуального дерева) к контексту данных всего окна. Я предполагаю, что единственный способ сделать это - использовать Mode=RelativeSource, но для этого необходимо указать AncestorLevel.

  1. Как определить AncestorLevel?
  2. Зачем мне вообще нужно указывать это, когда я знаю, что есть только одно окно? Другими словами, почему я не могу просто указать тип, к которому я хочу привязаться, и заставить механизм привязки развернуть дерево вверх, пока он не найдет первый объект требуемого типа?
  3. Если я выясню AncestorLevel, это не делает код хрупким? (Если я изменю вложение визуальных элементов, оно, очевидно, сломается.)

Если нет хорошего решения, связанного с RelativeSource, я подумал, что мог бы использовать альтернативный подход и «распространять» свойство уровня страницы вниз по логическому дереву к отдельным элементам в списке. Есть ли приемлемый шаблон для этого?

Был ли у RelativeSource способ обхода дерева поиска только по типу (или я это представляю)?

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Как определить AncestorLevel?

Посмотрев на визуальное дерево и выяснив количество вхождений указанного c типа родительского элемента. Хотя может быть только одно родительское окно верхнего уровня.

Зачем мне вообще нужно указывать это, если я знаю, что когда-либо есть только одно окно?

Вам не нужно. Это прекрасно, а также очень распространено указывать только AncestorType следующим образом:

{Binding SomePropertyOfTheWindow, RelativeSource={RelativeSource AncestorType=Window}}" />

Если я выясню AncestorLevel, разве это не делает код хрупким? (Если я изменю вложение визуальных элементов, оно, очевидно, сломается.)

Да, это правильно, но именно так вы указываете механизму привязки к какому конкретному элементу указанного c тип, который вы хотите привязать - при условии, что есть несколько вариантов для выбора.

0 голосов
/ 14 апреля 2020

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

Другой вариант, вместо привязки к указанному c типу управления, можно назвать ваши элементы управления в xaml с x: имя. Затем вы можете привязать непосредственно к этому элементу управления и собственности на него. Пример:

<SomeControl x:Name="IWantThisControl" />

[bunch of other controls]

<YourOtherControl ThisControlProperty={Binding ElementName=IWantThisControl, Path=PropertyOnTheOtherControl}" />

Не имеет значения уровень вложенности элементов управления при использовании привязки к ссылке ElementName.

0 голосов
/ 14 апреля 2020

См. Мой вопрос, аналогичная проблема была поднята там:
WPF находит предка для связывания

Короче - когда вы указываете тип предка, он ищется вверх по дереву элементов пока не будет найден предок данного типа (Уровень 1). Если вам нужно выполнить поиск на два уровня вверх (например, у вас есть сетка в сетке и вы стремитесь к «внешней» сетке), вы указываете AncestorLevel=2, и тогда предок становится вторым элементом этого конкретного типа при прохождении дерево элементов.

...