WPF - TextBlock のハイパーリンク用の DataTemplate/Value コンバーター
-
03-07-2019 - |
質問
人の名前、電子メール、部門などのリストを表示する ListBox があります。各プロパティを表示するためのいくつかの TextBlock を含む DataTemplate があります。これらの TextBlock の 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 のテキストを評価しているようなものです...
これを理解するのを手伝ってください。
ありがとう!
解決
作成したコンバーターは、 TextBlock
の Text
を、内部の 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}}" />
私が間違っていない限り、あなたが望むことをすべきです。
アップデート:OK、私は間違っています。WPF ハイパーリンクは Silverlight の HyperlinkButton ではなく、Content プロパティを持っていません。恥ずかしいですね。