Как получить доступ к родительскому классу внутри ресурса - PullRequest
0 голосов
/ 21 января 2011

Я пытаюсь создать сложную подсказку, в которой один из TextBlocks будет привязан к свойству UserControl, в котором эта подсказка определяется как ресурс.Упрощенная версия кода XAML выглядит следующим образом:

<UserControl x:Class="WpfApplication3.TestPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         xmlns:pixellab="clr-namespace:PixelLab.Wpf;assembly=UIControls"
         xmlns:my="clr-namespace:WpfApplication3"
         d:DesignHeight="499" d:DesignWidth="409"
         x:Name="PageInstance" >
<UserControl.Resources>
    <Grid x:Key="Tooltip">
        <TextBlock Text="{Binding ElementName=PageInstance, Path=PageTest}"/>
    </Grid>
</UserControl.Resources>
<Border Background="Red" ToolTip="{StaticResource Tooltip}" />

UserControl называется PageInstance.Граница, отображаемая внутри, имеет подсказку, определенную как ресурс.Если я пытаюсь связать текст с

<TextBlock Text="{Binding ElementName=PageInstance, Path=PageTest}"/>

, я получаю ошибку привязки при запуске приложения:

System.Windows.Data Ошибка: 4: Не удается найти источник для привязкисо ссылкой 'ElementName = PageInstance' .BindingExpression: Path = PageTest;DataItem = NULL;целевым элементом является TextBlock (Name = '');Целевым свойством является «Текст» (тип «Строка»)

Что мне нужно сделать, чтобы успешно связать текст со свойством PageTest в пользовательском контроле PageInstance?

Спасибо за любую помощь.Я до сих пор не совсем понял, как работают привязки.Грегор

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Используйте RelativeSource в вашей привязке, что-то вроде этого:

<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=PageTest}"/>
1 голос
/ 21 января 2011

Border унаследует DataContext от UserControl. Поэтому измените подсказку как таковую ...

<Grid x:Key="Tooltip">
    <TextBlock Text="{Binding PageTest}"/>
</Grid>

... и затем установка DataContext на UserControl приведет к тому, что модель со свойством PageTest перейдет к вашим Border и последующим дочерним элементам. Это исключает необходимость использования FindAncestor во всей его полноте.

PageInstance.DataContext = model;
...