WPF - Табличка данных / Преобразователь значений для гиперссылки в текстовом блоке

StackOverflow https://stackoverflow.com/questions/821476

Вопрос

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

<TextBlock>
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</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 Style="{StaticResource ResultItemTextBoxStyle}">
   <Hyperlink NavigateUri="{Binding Email}">
      <TextBlock Text="{Binding Email}" />
   </Hyperlink>   
</TextBlock>

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

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

Другие советы

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

<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>

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

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

Просто используя

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

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

Обновить:Хорошо, я ошибаюсь, гиперссылка WPF не является HyperlinkButton от Silverlight и не имеет свойства Content .Как мне не стыдно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top