WPF - DataTemplate / Value Converter для гиперссылки в TextBlock - PullRequest
1 голос
/ 04 мая 2009

У меня есть ListBox, показывающий список имен людей, электронных писем, отделов и т. Д. Существует DataTemplate, в котором есть несколько текстовых блоков для отображения каждого свойства. Один из этих TextBlocks заключает в себе гиперссылку для отображения адресов электронной почты, например:

<TextBlock>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

Это работает нормально, но если у человека нет адреса электронной почты, TextBlock не будет свернут автоматически. Поэтому я написал конвертер значений и использовал его в таком стиле (упрощенно):

string s = (String) value;
if (s == ""){
   return Visibility.Collapsed;
}
return Visibility.Visible;

И это стиль, использующий ValueConverter:

<Style x:Key="ResultItemTextBoxStyle">
    <Setter Property="TextBlock.Visibility" Value="{Binding Path=Text, RelativeSource={RelativeSource Self}, 
                                                    Converter={StaticResource StringToVisibilityConverter}}"/>
</Style>

И я добавил стиль вызова конвертера в TextBlock:

<TextBlock Style="{StaticResource ResultItemTextBoxStyle}">
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

После этого изменения адрес электронной почты никогда не отображается - в конвертере значений текст TextBlock всегда пуст и возвращает Visibility.Collapsed. Это похоже на оценку текста TextBlock перед загрузкой гиперссылки или чем-то ...

Пожалуйста, помогите мне разобраться с этим.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Я бы сделал что-то вроде этого:

<TextBlock>
   <TextBlock.Style>
      <Style>
         <Setter Property="Visibility" Value="Visible"/>
         <Style.Triggers>
            <DataTrigger Binding="{Binding Email}" Value="">
               <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBlock.Style>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

Я думаю, что писать конвертер значений - это излишне (без обид).

1 голос
/ 04 мая 2009

Преобразователь, который вы написали, сравнивает Text TextBlock с пустым, а не с внутренним Hyperlink. Я думаю, что вы действительно хотите установить RelativeSource для ребенка Hyperlink, но я не думаю, что это возможно.

Вы уверены, что размер TextBlock не рухнет? Если вместо этого вы поместите стиль на Hyperlink (или даже на его внутренний TextBlock), возможно, это все равно будет работать?

Редактировать: Hyperlink не имеет свойства Visibility, поэтому перемещение стиля к нему не поможет, к сожалению. Единственный другой вариант, о котором я могу подумать, - это создать собственный элемент управления, производный от TextBlock и содержащий Hyperlink и TextBlock. Если вы добавите Email DependencyProperty к нему, то вы можете использовать его, чтобы определить, должен ли элемент управления быть видимым или нет, а также для значения Hyperlink и его внутреннего TextBlock.

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

0 голосов
/ 04 мая 2009

Я знаю, что это не совсем ваш вопрос, но почему вы вообще используете текстовые блоки?

Просто с помощью

    <Hyperlink NavigateUri="{Binding Email}" Content="{Binding Email}" 
Visibility="{Binding Email, Converter={StaticResource StringToVisibilityConverter}}" />

должен делать то, что вы хотите, чтобы он делал, если я не ошибаюсь.

обновление: ОК, я ошибаюсь, WPF Hyperlink не является Silverlight HyperlinkButton и не имеет свойства Content. Позор мне.

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