Дочерняя гиперссылка WPF

У меня есть WPF Hyperlink, который я могу щелкнуть и получить его свойство NavigateUri просто отлично. Однако я хочу иметь возможность связывать некоторую дополнительную информацию с Hyperlink, чтобы я мог обрабатывать ее в своем обработчике событий. Вот как это выглядит прямо сейчас:

<TextBlock Grid.Row="0">
    <Hyperlink ToolTip="{Binding Path=Contact.ToolTipPersonalEmail}" 
           Name="ContactHyperlink" Foreground="#FF333333" 
           RequestNavigate="HandleContactEmailClicked" 
           NavigateUri="{Binding Path=Contact.Email}"
           >
        <TextBlock Text="{Binding Path=Contact.Fullname}" Width="Auto"
            HorizontalAlignment="Stretch"
            TextTrimming="CharacterEllipsis"/>
        <TextBlock Text="{Binding Path=Data1}" Name="data1"  Visibility="Collapsed" />
        <TextBlock Text="{Binding Path=Data2}" Name="data2"  Visibility="Collapsed" />  
    </Hyperlink>

</TextBlock>

По сути, в моем обработчике событий я хочу иметь доступ к данным внутри двух текстовых блоков, которые имеют видимость = «Свернуто» (данные1 и данные2). Я сравниваю это со «скрытыми» данными в HTML-форме.

Я пытался возиться со свойством «Inlines» Hyperlink, но это не работает, и, поскольку оно находится внутри DataTemplate, я не могу получить доступ к данным1 и данным2 по имени в моем коде.

Есть идеи?

Спасибо.


person Max    schedule 22.05.2009    source источник


Ответы (2)


В вашем обработчике событий вы можете сделать что-то вроде этого:

ContentPresenter presenter = (ContentPresenter)sender.TemplatedParent;
DataTemplate template = presenter.ContentTemplate;
TextBlock textBlock = (TextBlock)template.FindName("data1", presenter);

Возможно, не самый красивый способ, но он работает для меня.

person Brandon    schedule 22.05.2009

создание текстовых блоков для хранения этих данных несколько... излишне. Я бы выбрал один из этих двух вариантов:

  1. используйте привязку данных, чтобы поместить определенный объект в гиперссылку, а затем, чтобы вернуть его, все, что вам нужно сделать, это получить доступ к DataContext гиперссылки, и он предоставит вам класс, который содержит данные1 и данные2
  2. прикрепите объект, который заполняет данные1 и данные2, в атрибут TAG гиперссылки
person Stephen Wrighton    schedule 22.05.2009
comment
Спасибо, Стивен. Кажется, я понимаю, что вы имеете в виду. Я также собираюсь попробовать подход DataContext и посмотреть, как он работает, потому что он кажется более элегантным. - person Max; 22.05.2009