1

人の名前、電子メール、部門などのリストを表示する ListBox があります。各プロパティを表示するためのいくつかの TextBlocks を持つ DataTemplate があります。これらの TextBlocks の 1 つは、ハイパーリンクをラップして、電子メール アドレスを次のように表示します。

<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 のテキストを評価しているようなものです...

これを理解するのを手伝ってください。

ありがとう!

4

3 に答える 3

3

私はこのようなことをします:

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

値コンバーターを書くのはやり過ぎだと思います (攻撃を意図したものではありません)。

于 2009-05-04T19:38:50.813 に答える
1

あなたが書いたコンバーターは、内部のテキストではなく、TextTextBlockを空と比較していますHyperlink。本当に をRelativeSourcechildに設定したいと思いますHyperlinkが、それは不可能だと思います。

TextBlockつぶれないサイズでよろしいですか?Hyperlink代わりに (またはその内部の)スタイルを配置した場合TextBlock、それはまだ機能するでしょうか?

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

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

于 2009-05-04T19:22:29.590 に答える
-1

これはあなたの質問ではないことはわかっていますが、なぜテキストブロックを使用するのですか?

単に使用する

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

私が間違っていない限り、あなたがしたいことをするべきです。

更新: OK、私は間違っています。WPF Hyperlink は Silverlight の HyperlinkBut​​ton ではなく、Content プロパティを持っていません。私を恥じてください。

于 2009-05-04T19:22:09.920 に答える