2009-09-09 24 views
9

私はこれらの線に沿って何かを探しています:WPFでTextBlockのセンテンスの途中にバインディングを挿入するにはどうすればよいですか?

<TextBlock 
    Grid.Column="1" 
    Text="Welcome, {Binding UserName}!" /> 

これはもちろん、実際にテキストを表示する「{ユーザー名をバインド}」のユーザーには、むしろそれをデコードし、私はあなたがこのような何かを行うことができます知っているよりWPFでこれを動作させる方法があることを期待しています。

私は既に私がIValueConverterを使用できることを知っています...可能ならば私はマークアップで純粋にできることを探しています。

EDIT:@Mattハミルトンの最も優れたソリューションに基づいて

、私は封筒をプッシュしてMultiBindingを使用して、同じTextBlockに2つの値をバインドしようとしました。作品の魅力のように:これは、生産

<TextBlock 
    Style="{StaticResource TextBlock_ValueStyle}" 
    Grid.Column="1"> 
    <TextBlock.Text> 
     <MultiBinding 
      StringFormat="{}Attempts: {0:G} of {1:G}"> 
      <Binding 
       Path="AttemptNumber" /> 
      <Binding 
       Path="AttemptCount" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Attempts: 1 of 4AttemptNumber = 1AttemptCount = 4を想定)。

私はまた、コロンの後に配置するようにフォーマットされ考え出すために、このリンクが役に立ったと評価:

http://msdn.microsoft.com/en-us/library/fbxft59x.aspx

答えて

15

あなたは、.NET 3.5 SP1でStringFormatバインドプロパティを使用することができます。

更新はい、複数の値もサポートされています。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="Welcome, {0} {1}!"> 
      <Binding Path="FirstName" /> 
      <Binding Path="LastName" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
+0

すごい、いいね。しかし、通常の[string] :: Formatとまったく逆のので、順序は奇妙です。 – Joey

+0

美しい!しかし、これは別の質問につながります。複数のバウンド値を持つことは可能ですか、それとも1つに制限されていますか?ありがとう。 – devuxer

+0

自分の質問に答えました(私の編集を参照)。 – devuxer

0

これまでのところ、私は全く同じように、これが可能に解決策を知りませんあなたはそれを記述する。しかし、あなたは、回避策として、あなたの文章をつなぎ合わせるために、複数のテキストブロックを使用することができます。

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Welcome, "/> 
    <TextBlock Text="{Binding UserName}"/> 
    <TextBlock Text="!"/> 
</StackPanel> 

これは私がこれまで使用して面倒ながら、最も簡単な解決策であるように思わ入力するものです。しかし、国際化が必要になるとすぐに、それは明らかな理由から無駄です。あなたはバックスラッシュで文字列の形式で中括弧をエスケープする必要が

<TextBlock Text="{Binding UserName,StringFormat='Welcome, \{0\}!'}" /> 

注:

+0

私は、属性と値のペアを(例えば、「ステータス:成功」)の前に一緒に文字列に 'StackPanel'を使用しましたが、私は、文ための文字列一緒に別の部分にそれを使用するには少し警戒しました私は、自然なテキストの間隔が維持されないかもしれないと考えました(つまり、 'TextBlocks 'の間に同じ' TextBlock'の単語よりも大きな休憩があります)。これが問題ではないことが判明した場合、これは良い解決策です – devuxer

+0

これまでのところ、余分なスペースがないことに気がつきましたが、カーニングは自動合字などと同じように動作しません。本質的には、テキストを別の実行に分けて、高度なタイポグラフィが疑問に思えます。かなり深刻なもので、可能な限り、文字列と変数を連結したり、非定位置のフォーマット文字列を使用したりすることは避けてください。時には、このようなクイックで汚れた解決策が生き残る:-) – Joey

0

は、このライブラリ "WPFix" を見てみましょう。ユーザーはラムダ式をXAMLに書くことができます。私はデモコードでのみ、実動コードで使用しませんでした。私は、フォームの幅を2つに分割し、その値をコントロールにバインドすることができました。通常、記述したように、コンバータクラスを作成する必要があります。このライブラリは、あなたが探しているものになることがあります。

http://www.fikrimvar.net/lestirelim/?p=15

1

これは、あなたがスタイルのボタンやその他のコントロールをインライン化することができ、テキストやコントロール

<TextBlock>Welcome, <TextBlock Text="{Binding UserName}"/>!</TextBlock> 

を混合する最も簡単な方法です。

1

実行する最善の方法は、実行を使用しています...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
関連する問題