WPF - Табличка данных / Преобразователь значений для гиперссылки в текстовом блоке
-
03-07-2019 - |
Вопрос
У меня есть 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 .Как мне не стыдно.