2009-09-15 9 views
7

クライアントの年齢を表示するには次のコードがあります。WPFテキストボックス内の結合テキストと固定テキスト

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" /> 

しかし、だけではなく、単に数を表示するので、私はテキスト「年齢」を前に付け、それが効果的に「年齢36歳」

になっているので、テキスト「歳」とそれをサフィックスしたいです

私はこれを水平StackPanelと3 Textboxで実現できますが、はるかに簡単な方法がありますか?

+0

「年齢」と「年齢」の部分を編集可能にしますか?私。ユーザーは「年齢40歳」(またはおそらくは単に「40」)をテキストボックス全体に入力して、それを正しく解析できるようにする必要がありますか? –

+0

いずれの場合でも、アプリケーション内にこのようなテキストボックスが1つしかない場合(つまり、再利用する必要がない場合)、StackPanel + 2 TextBlocks + TextBoxソリューションが最も簡単になります。 –

+0

これは単なる読み込み専用として使用され、更新は必要ありません。 – Mitch

答えて

8

年齢値が編集可能である必要がないと仮定した場合、WPF 4.0ではRunのTextプロパティがバインド可能になります。プレリリース版を使用していない限り、

<TextBlock x:Name="txtClientAge" > 
    <Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/> 
</TextBlock> 

UPDATE動作しますが(実際にはそのかなりハック)は特にきれいではないでしょうフォーマット文字列溶液にHERESに別の代替:以下のような何かを行うことができます。バインディング(顧客プロパティはint型であると仮定した場合)に、以下のコンバータを使用します。

public class AgeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     string age = value.ToString(); 
     return "Age " + age + " years"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     string age = value as string; 
     return Int32.Parse(age.Replace("Age ", " ").Replace(" years", "")); 
    } 
} 
+0

おかげさまでサイモン、それは私が探していたものでしたが、あなたが言うように、それはまだ私たちとはあまりありません!私は、WPF 4.0が私たちと一緒になるまで、今のところ長引いたアプローチを採用しなければならないかもしれません。 – Mitch

+0

横の思考の仲間の素敵なビット。私は現在、あなたのアプローチが本当にアピールするようにあらゆる種類のコンバーターを使用して楽しんでいます。ありがとう! – Mitch

+0

ええ、ConvertBackは私が好きではない部分ですが、それ以来、問題は起こりそうにない読み取り専用の状況です。 –

5

バインディングするクラスに、表示するテキスト文字列を作成するプロパティを作成することもできます。

StringFormatルートもあります:

<textblock text="{Binding Path=mydate, StringFormat=d}"/> 

あなたはフォーマット文字列に定数をハックすることができます。

私はプロパティメソッドを使用します。

+3

これは本質的にモデルをビュー認識に変更しています。これはデザインの観点からは非常に悪い考えです。 –

+1

+1 for StringFormat。 @Pavelに同意する - このテキストを含むプロパティを作成しないでください。 – Andy

+2

本当にこれを行うには、テキストはビューにも属していません。現在のカルチャー設定に基づいて、プレゼンテーション層が選択したリソース領域に存在する必要があります。だから、私のものはすべてプレゼンターのプロパティから来ています。 – Jay

5

これはかなり古い質問ですが、私は、これは現在の最善の解決策(テキストを編集したい場合)だと思います。

TextBlockInlineUIContainerで入れ子にして入れ子にしてTextboxとすることができます。

注:私はBaselineAlignment="Center"を使ってコンポーネントを整列させました。必要に応じて、プラスまたはマイナスのマージンをTextBoxに追加することもできます。また、編集可能で選択可能であっても、TextBlockの一部のように見えるように、TextBoxの境界線を透明に設定しました。

<TextBlock Foreground="SteelBlue"> 
    <Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/> 
    <InlineUIContainer BaselineAlignment="Center"> 
     <TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/> 
    </InlineUIContainer> 
</TextBlock> 
+1

はい、私は元の質問者が最終的には「年齢」は読んでほしいと思っていましたが、これは尋ねられた質問に対する答えです:-) –

1

これは前の回答のようです - (しかし、彼らはので、ここで... Texblocksで、すべてのテキストボックスバージョンです)、私はまた、多アプローチを見せたかったです。 Texboxはあなたがやりたいことを得るには、次のコードを使用することができます:

<TextBox> 
<TextBox.Text> 
    <MultiBinding StringFormat="Age {0} yrs and {1} months"> 
    <Binding Path="Years" /> 
    <Binding Path="Months" /> 
    </MultiBinding> 
</TextBox.Text> 
</TextBox> 

を使用すると、ユーザーは、コードをコピーすることができますので、あなたのテキストを選択したい場合には有用である可能性があります。

関連する問題