2009-09-15 3 views
7

클라이언트 나이를 표시하는 데 다음 코드가 있습니다.WPF TextBox에서 바운드 및 고정 텍스트 혼합

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

그러나, 대신 단지 수를 표시하는, 나는 그것을 효과적으로 "나이 36 세"

된다되도록 텍스트 "나이"로 접두사와 텍스트 "세"와 접미사 할

가로 StackPanel과 3 개의 Textbox를 사용하여이 작업을 수행 할 수 있지만 누락 된 훨씬 간단한 방법이 있습니까?

+0

"연령"및 "연도"부분을 편집 가능하게 하시겠습니까? 나는. 사용자는 "연령 40 세"(또는 단순히 "40")를 입력란 전체에 입력하고 올바르게 구문 분석 할 수 있어야합니까? –

+0

어쨌든 응용 프로그램에 이러한 텍스트 상자가 하나만있는 경우 (다시 사용할 필요가 없음) 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는 작동하지만 (사실은 매우 해키에서) 특히 꽤하지 않습니다 포맷 스트링 솔루션에 대한 또 다른 대안.

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

감사합니다. Simon, 그건 내가 찾고있는 종류의 것이었지만, 당신이 말한대로, 그것은 아직 우리와 꽤 다릅니다! WPF 4.0이 우리와 함께 할 때까지는 지금 당장은 당황 스럽습니다. – Mitch

+0

측면 생각 친구의 좋은 비트. 저는 현재 모든 종류의 것들을 위해 Converters를 사용하고 있습니다. 그래서 당신의 접근 방식은 정말 매력적입니다. 고마워! – Mitch

+0

ConvertBack은 내가 싫어하는 부분이지만 문제가되지 않을만한 읽기 전용 상황입니다. –

5

바인딩하려는 클래스에 속성을 만들면 표시 할 텍스트 문자열을 만들 수 있습니다.

도있는 StringFormat 경로있다 :

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

당신은 형식 문자열로 상수를 해킹 할 수 있습니다.

나는 속성 메서드를 선호합니다.

+3

이것은 본질적으로 모델을보기 인식하도록 수정하는 것입니다. 이는 디자인 측면에서 볼 때 매우 나쁜 생각입니다. –

+1

+1 for StringFormat. @Pavel에 동의하십시오.이 텍스트가있는 속성을 생성하지 마십시오. – Andy

+2

이 작업을 올바르게 수행하려면 텍스트가보기에도 속하지 않습니다. 현재 문화권 설정에 따라 프리젠 테이션 계층에서 선택한 리소스 영역에 있어야합니다. 그래서 내 모든 것을 발표자 속성에서 가져옵니다. – Jay

5

이것은 아주 오래된 질문이다,하지만 난 (텍스트를 편집 할 경우)이 현재 최선의 해결책이라고 생각 : 바인딩에 다음과 같은 변환 (가정 피보호자 재산 int 유형의)를 사용합니다.

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에있어) 나는 또한 Multibinding 접근 방식을 보여주고 싶었다. 당신이 그렇게 사용자가 코드를 복사 할 수 있습니다 텍스트를 선택할 수 있도록하려면

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

그것은 유용 할 수 있습니다 : 당신이 원하는 것을 할 수있는 Texbox을 얻으려면, 다음과 같은 코드를 사용할 수 있습니다.

관련 문제