WPF: Как скрыть пустую гиперссылку? - PullRequest
0 голосов
/ 07 апреля 2011

В моем предыдущем вопросе я спросил, как скрыть пустое TextBlock, чтобы оно не занимало место на панели. У меня сейчас новый вызов. Как я могу спрятать пустую Hyperlink:

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

Вот что сделало возможным сокрытие в предыдущем вопросе:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <Trigger Property="Text" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>

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

Я уверен, что мой стиль должен быть применен к Hyperlink, но триггер внутри должен быть нацелен на свойство Visibility 'Hyperlink 's parent TextBlock`. Как должен выглядеть стиль?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Просто используйте DataTrigger на верхнем уровне TextBlock, чтобы проверить, является ли привязанное свойство пустой строкой:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Email}" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>

EDIT:

Также вы можете попробовать связать свойство NavigationUri дочерней гиперссылки:

<TextBlock.Style>
  <Style TargetType="TextBlock">
    <Style.Triggers>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Inlines
[0].NavigateUri}" Value="">
        <Setter Property="Visibility" Value="Collapsed" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</TextBlock.Style>
0 голосов
/ 12 апреля 2011

Решение , предоставленное Foovanadil , которое решает аналогичную проблему путем реализации конвертера видимости , на мой взгляд, работает лучше всего.Это самый простой в реализации и может быть использован повторно при необходимости.

Конвертер должен быть реализован так:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                                                            CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value as string))
        {
            return Visibility.Collapsed;
        }
        else
        {
            return Visibility.Visible;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                                                             CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

}

И используется так:

<Window.Resources>
    <!-- Visibility converter -->
    <converters:VisibilityConverter x:Key="visibleConv" />
</Window.Resources>
...
<TextBlock Visibility="{Binding Something, Converter={StaticResource visibleConv}}">
    <Hyperlink NavigateUri="{Binding Something}">
        <TextBlock Text="{Binding Something}" />
    </Hyperlink>
</TextBlock>

Все кредиты идут в оригиналпоставщик решений: Фуванадил

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