Высота привязки сетки с использованием FindAncestor и AncestorLevel к другой сетке - PullRequest
6 голосов
/ 06 сентября 2010

Мой вопрос касается правильного связывания свойства одного элемента с другим.

Вот структура моего кода:

  1. Шаблон данных содержит сетку (назовем ее сеткой GridA), а в сетке я указываю экземпляр элемента управления, называемый ControlA.

  2. ControlA - это UserControl, который содержит Grid. В ControlA (программный код) есть пользовательская логика, которая динамически создает контент, но в двух словах, он использует другой шаблон данных.

  3. Шаблон данных для ControlA состоит из другого Grid. Я хочу связать свойство Height для этой сетки в этом шаблоне данных со свойством Height Grid в шаблоне данных, указанном в моей первой маркированной точке выше (сетка с именем GridA).

Вот XAML, который я использовал для привязки, но, по сути, он не работает, так как не находит Grid:

<Grid Height="{Binding Path=ActualHeight,
                       RelativeSource={RelativeSource FindAncestor,
                                       AncestorType=Grid,
                                       AncestorLevel=2},
                       UpdateSourceTrigger=PropertyChanged}">
</Grid>

Я понимаю, что, указав AncestorLevel=2, он будет использовать второе «найденное» вхождение искомого типа, в данном случае типом является Grid. Поэтому, на мой взгляд, он сначала найдет Grid в ControlA, затем продолжит идти вверх по дереву и найдет Grid в первом шаблоне данных, который является Grid с именем GridA. Это должно быть второе вхождение, верно?

Ответы [ 2 ]

6 голосов
/ 06 сентября 2010

Поскольку вы начинаете поиск со второй сетки, вы на самом деле хотите, чтобы уровень предка = 1 (по умолчанию).Заметьте:

<Grid x:Name="first">
    <Grid x:Name="second">
        <Grid x:Name="third" Tag="{Binding Name, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=2}}">
            <!-- displays "first", not "second" -->
            <TextBlock Text="{Binding Tag, ElementName=third}"/>
        </Grid>
    </Grid>
</Grid>

Кстати, ваш дизайн звучит так, как будто он больше подходит системе макетов WPF, чем охватывает ее.Таким образом, вы, вероятно, создаете много ненужной боли для себя.

0 голосов
/ 07 сентября 2010

Я что-то упустил, или вы можете просто использовать свойство SharedSizeGroup RowDefinitions и установить Grid.IsSharedSizeGroup="True" на крайнем элементе управления?

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