2009-09-15 49 views
7

我有下面的代碼顯示客戶的年齡。WPF在TextBox混合綁紮固定文本

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

然而,而不只是顯示只是數字,我想用文字「時代」前綴,並用文字「年」後綴,以便它有效地成爲「年齡36歲」

我可以用一個水平的StackPanel和3個文本框實現這一點,但是有沒有更簡單的方法,我錯過了?

+0

你想要「年齡」和「年」部分是可編輯的嗎?即是否允許用戶將「年齡40歲」(或者也可能只是「40」)全部輸入到文本框中,並正確解析它? – 2009-09-15 22:00:51

+0

在任何情況下,如果你只在你的應用程序中的單個這樣的文本框(即沒有必要爲它可重用),該StackPanel中+ 2周+的TextBlocks文本框的解決方案將是最簡單的。 – 2009-09-15 22:03:22

+0

它只是作爲只讀使用,不需要更新。 – Mitch 2009-09-15 23:08:20

回答

8

假設你不需要年齡值可編輯,在WPF 4.0運行的Text屬性會綁定,這可能不利於你現在除非你使用的是預發佈,但你會能夠做到像下面這樣:

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

UPDATE繼承人另一替換格式字符串的解決方案,將工作,但不是特別漂亮(其實它很哈克)。使用上結合下述轉換器(假設委託關係屬性的類型爲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 2009-09-15 23:07:06

+0

不錯的側面思考隊友。我目前正在享受使用轉換器的各種事情,所以你的方法真的很吸引人。感謝那! – Mitch 2009-09-16 22:31:09

+0

是的,ConvertBack是我不喜歡的部分,但是因爲它是隻讀的情況,不會成爲問題。 – 2009-09-16 23:02:10

5

你可以創建你也結合了類的屬性創建你想顯示的文本字符串。

另外還有的StringFormat路線:

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

你能砍常數爲格式化字符串。

我喜歡的屬性方法。

+3

這實質上是將您的模型修改爲視圖感知 - 從設計的角度來看,這是一個非常糟糕的想法。 – 2009-09-15 21:59:33

+1

對於StringFormat爲+1。同意@Pavel - 不要使用此文本創建屬性。 – Andy 2009-09-15 22:48:57

+2

如果你真的想這樣做,那麼文本也不屬於視圖。它需要位於表示層根據當前文化設置選定的資源區域中。這就是爲什麼我所有的東西都來自演示者的屬性。 – Jay 2009-09-16 20:11:18

5

這是一個很老的問題,但我認爲這是目前最好的解決辦法(如果你要編輯的文本)。

您可以使用InlineUIContainerTextBlock中嵌套Textbox

注:我用BaselineAlignment="Center"對準部件。如有必要,您還可以向TextBox添加正面或負面的邊距。此外,我將TextBox的邊框設置爲透明,使其看起來像TextBlock的一部分,即使它是可編輯和可選的。

<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

是的,我意識到原來的提問者最終希望'年齡'是隻讀的 - 但這是對問題的回答,如問:-) – 2011-10-06 04:57:20

1

這就像以前的答案 - (但他們都與Texblocks ......所以這裏一個文本框的版本),我也想展示Multibinding方法。爲了得到一個Texbox做你想要什麼,你可以使用下面的代碼:

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

,如果你想使你的文字進行選擇,這樣用戶可以將代碼複製它可能是有用的。