2009-05-04 14 views
1

私は、人の名前、電子メール、部署などのリストを表示するリストボックスを持っています。各プロパティを表示するTextBlockがいくつかあります。これらのTextBlockの一つは、そのような電子メールアドレスを表示するには、ハイパーリンクをラップしている: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

あなたは電子メールがヌルではないと確信していますか? –

答えて

1

あなたが書き込んだコンバータは、TextBlockTextと、内部のテキストではなく空のものを比較しています。Hyperlink。私はあなたが本当に子供HyperlinkRelativeSourceを設定したいと思うが、それは可能ではないと思う。

折りたたまれていないTextBlockのサイズは本当ですか?代わりにHyperlink(またはその内部のTextBlock)にスタイルを置くと、それでも機能するのでしょうか?

編集:HyperlinkにはVisibilityというプロパティがありません。そのため、スタイルを動かすと残念なことです。私が考えることができる他の唯一のオプションは、TextBlockから派生したカスタムコントロールを作成することです。それにはHyperlinkTextBlockが含まれています。 EmailDependencyPropertyを追加すると、コントロールを表示するかどうかを決定し、Hyperlinkの値とその内部のTextBlockの値を判断できます。

これを処理するにはより良い方法があるようですが、現在は何も考えられません。

+0

アンディ、ありがとうございます。私はそれについて考えていましたが、あなたが指摘したように、もっと簡単な解決策があるはずです。 私は小さなユーザーコントロールを作成し、正常に動作しました。 –

-1

これはあなたの質問ではありませんが、なぜテキストブロックを使用するのですか?単に私が間違っていない限り、あなたは、それを行うのですかやりたいはずです

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

を使用して

更新:OK、私は間違っています、WPFハイパーリンクはSilverlightのHyperlinkBut​​tonではなく、Contentプロパティはありません。私には恥ずべき。

+0

それは私のために働かない。ハイパーリンクはContentプロパティを持たず、UIElementではないため、コンテナに直接追加することはできません。 – Andy

+0

Dammit、私はWPFではなく、Silverlightに存在するHyperlinkBut​​tonについて考えていました。 申し訳ありませんが、今すぐベッドに行きます... –

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、 あなたの答えをありがとう。まったく違反ではありません。私はそのためのコンバータが過剰なものであることに同意します。しかし、私は空の可能性がある他の多くの文字列プロパティを持っているので、私はどこでもコンバータを使用することができます。 私はあなたの提案をテストすることに興奮しましたが、それでも私は同じ結果を示しています - 電子メールが空のときには崩壊しません。 :( –

関連する問題