Silverlight RelativeSource привязки TemplatedParent внутри шаблона данных, возможно ли это? - PullRequest
4 голосов
/ 03 мая 2010

Я пытаюсь сделать гистограмму контроля пользователя. Я создаю каждый бар, используя DataTemplate.

Проблема в том, что для того, чтобы вычислить высоту каждого бара, сначала нужно узнать высоту его контейнера (TemplatedParent). К сожалению что у меня есть:

Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" 

не работает. Каждый раз значение NaN возвращается в мой конвертер. RelativeSource={RelativeSource TemplatedParent} не работает в этом контексте? Что еще я могу сделать, чтобы мой DataTemplate мог «общаться» с элементом, к которому он применяется?

Если это поможет, вот базовый шаблон данных:

<DataTemplate x:Key="BarGraphTemplate">
    <Grid Width="30">
        <Rectangle HorizontalAlignment="Center" Stroke="Black" Width="20" Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" VerticalAlignment="Bottom" />
    </Grid>
</DataTemplate>

Ответы [ 2 ]

5 голосов
/ 03 мая 2010

Чтобы ответить на ваш вопрос, RelativeSource работает только в ControlTemplate, он не работает в DataTemplate.

. Есть ли причина, по которой Silverlight Toolkit Chart управляет надписью?Вы не сможете создать гистограмму (или столбчатую диаграмму, поскольку Tookit относится к вертикальному набору столбцов).

0 голосов
/ 20 мая 2010

Вы пробовали свойство ActualHeight?Он должен вернуть вам значение.RelativeSource с режимом TemplatedParent будет работать в шаблоне данных, но он будет возвращать предъявителя содержимого шаблонного элемента управления / элемента, а не сам элемент управления / элемент (что он делает при использовании в шаблоне элемента управления).Чтобы поэкспериментировать, поместите кнопку в шаблон данных и назначьте это выражение привязки (без пути) его свойству Tag.Обработайте его событие Click и поместите точку останова в обработчик события.Теперь, когда вы запустите проект и нажмете кнопку, в вашем коде будет достигнута точка останова, и вы сможете увидеть объект, к которому он привязан, из свойства Tag кнопки (которое вы можете увидеть из параметра sender).Надеюсь, это поможет ...

...