2009-05-04 3 views
1

사람들의 이름, 전자 메일, 부서 등의 목록을 보여주는 ListBox가 있습니다. 각 속성을 표시 할 TextBlock이 몇 개인 DataTemplate이 있습니다. 이 TextBlocks 중 하나는과 같이 이메일 주소를 표시하는 하이퍼 링크를 포장한다 :TextBlock의 하이퍼 링크 용 WPF - DataTemplate/Value Converter

<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의 텍스트를 평가하는 것과 같습니다 ...

이 그림을 이해하는 데 도움주세요.

감사합니다.

+0

이메일이 null이 아니십니까? –

답변

1

작성한 변환기는 TextBlockText과 내부의 텍스트가 아닌 의 텍스트를 비교하는 것입니다. 내 생각에 당신은 실제로 RelativeSource을 자식 Hyperlink으로 설정하고 싶다고 생각하지만 가능하지 않다고 생각합니다.

붕괴되지 않는 것이 TextBlock 크기입니까? 스타일을 Hyperlink (또는 그 내부 인 TextBlock)에두면 어떨까요?

편집 : Hyperlink에는 Visibility 속성이 없으므로 스타일을 옮기는 것이 도움이되지 않습니다. 생각할 수있는 유일한 다른 옵션은 TextBlock에서 파생 된 사용자 지정 컨트롤을 만드는 것입니다.이 컨트롤에는 HyperlinkTextBlock이 포함되어 있습니다. EmailDependencyProperty을 추가하면이를 사용하여 컨트롤을 표시할지 여부를 결정하고 Hyperlink 및 내부 값 TextBlock 값을 결정할 수 있습니다.

이 문제를 처리하는 더 좋은 방법이있는 것 같지만 현재는 아무 것도 생각할 수 없습니다.

+0

Andy, thanks. 나는 그것에 대해 생각해 보았지만, 당신이 지적했듯이보다 직선적 인 해결책이있는 것처럼 보입니다. 작은 사용자 정의 컨트롤을 만들었고 정상적으로 작동했습니다. –

-1

나는 이것이 정확히 당신의 질문이 아니라는 것을 알고 있지만, 왜 당신은 전혀 텍스트 블록을 사용합니까? 간단하게 내가 잘못 생각하지 않는 한, 그것을해야합니까 싶은 일을해야

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

를 사용

.

업데이트 : 오케이, 나는 WPF 하이퍼 링크가 Silverlight의 HyperlinkButton이 아니며 Content 속성을 갖고 있지 않습니다. 부끄러운 줄 알아.

+0

나를 위해 일하지 않습니다. 하이퍼 링크에는 Content 속성이 없으며 UIElement가 아니기 때문에 해당 컨테이너에 직접 추가 할 수 없습니다. – Andy

+0

Dammit, 나는 WPF가 아닌 Silverlight에 존재하는 HyperlinkButton에 대해 생각하고있었습니다. 죄송합니다. 지금 잠자리에 드십시오 ... –

2

나는 이런 식으로 뭔가를 할 것이다 : 나는 과잉 값 변환기를 기입이 생각

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

(악의 의도 없음).

+0

Bob, 답변 해 주셔서 감사합니다. 전혀 범죄가 아닙니다. 나는 그 컨버터가 과잉이라고 동의한다. 그러나 비어있는 많은 다른 문자열 속성이 있으므로 어디에서나 변환기를 사용할 수 있습니다. 나는 당신의 제안을 시험하게되어 기뻤지 만, 여전히 같은 결과를 보여줍니다. - 이메일이 비었을 때 붕괴하지 않습니다. :( –