StringFormat을 사용하여 WPF XAML 바인딩에 문자열 추가


125

정수 값 (이 경우 섭씨 온도)에 대한 단방향 바인딩이있는 TextBlock이 포함 된 WPF 4 응용 프로그램이 있습니다. XAML은 다음과 같습니다.

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

이것은 실제 온도 값을 표시하는 데 잘 작동하지만 숫자 대신 ° C를 포함하도록이 값을 형식화하고 싶습니다 (단지 30 대신 30 ° C). 저는 StringFormat에 대해 읽었으며 다음과 같은 몇 가지 일반적인 예를 보았습니다.

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

불행히도 내가 본 예제 중 어느 것도 내가하려는 것처럼 바운드 값에 문자열을 추가하지 않았습니다. 나는 그것이 단순해야 할 것이라고 확신하지만 그것을 찾을 운이 없습니다. 누구든지 그 방법을 설명해 줄 수 있습니까?

답변:


218

첫 번째 예는 효과적으로 필요한 것입니다.

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
xaml의 문자열 형식에 선행이 비어있는 이유는 무엇 {}입니까?
Jonesopolis

6
@Jonesopolis 문서에 있지만 형식 문자열이로 시작하면 xaml에 이미 의미가 있으므로 {이스케이프 메커니즘을 제공합니다 {}.
Reed Copsey

5
문서에서 선행 {}을 설명하는 위치를 알 수 없습니다.
Eric

5
@Eric 많은 문서와 마찬가지로 악취가납니다. 데모는 있지만 설명하지는 않습니다.
Reed Copsey

19
여기 신비한 {}의 문서 : msdn.microsoft.com/en-us/library/ms744986.aspx
Jotrius

107

다음은 문자열 중간에 바인딩이 있거나 여러 바인딩이있는 경우 가독성을 위해 잘 작동하는 대안입니다.

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

6
문자열 라이브러리에서 텍스트를 쉽게 삽입 할 수 있기 때문에이 답변이 조금 더 좋습니다. 물론 국제화에 대해 정말 걱정된다면 숫자와 단위의 순서가 고정되지 않도록 변환기를 사용하는 것이 더 나을 것입니다. <Run Text = "{x : Static s : UIStrings.General_FahrenheitAbbreviation}"/>
Matt Becker

1
이것은 훌륭한 솔루션이지만 최종 텍스트 디스플레이에서 텍스트 실행 사이에 추가 공간이 생깁니다. 이유는 무엇입니까? 귀하의 예에서 볼 수 있습니다0 °C ( 32 °F)
Conrad

실제 문자열 형식화 (예 : 소수점 이하 자릿수 제어 등)를 수행하려는 경우에는 그다지 유용하지 않습니다.
BrainSlugs83

5
@Conrad 각 실행 사이에 공백을 두지 않으려면 다음과 같이 해당 실행을 한 줄에 입력해야합니다. <TextBlock> <Run Text = "{Binding CelsiusTemp}"/> <Run Text = "° C"/ > <실행 텍스트 = "("/ <실행 텍스트 = "{화씨 바인딩}"/> <실행 텍스트 = "° F)"/> </ TextBlock에>
라디 Ondris

94

바인딩에서 StringFormat을 사용하는 것은 "text"속성에 대해서만 작동하는 것처럼 보입니다. 이것을 Label.Content에 사용하면 작동하지 않습니다.


16
필사적 일 때까지 시도해 보았고이 의견이 내 의심을 확인하는 데 도움이 되는 매우 중요한 점입니다.
DonBoitnott

64
ContentStringFormat구조에 온다 Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}". 예 : .
astrowalker

2
해당 정보를 게시 한 진정한 영웅 인 Casper에게 감사드립니다.
DaWiseguy

5
GridViewColumn 헤더의 경우HeaderStringFormat="{}{0} For Report"
Felix

2
디자인 타임 데이터를 사용하는 경우 ContentStringFormat을 편집하여 변경 사항을 디자이너에 반영하려면 프로젝트를 다시 빌드해야하는 것처럼 보이지만 StringFormat은 텍스트 상자에 사용 된 것처럼 실시간으로 디자이너를 업데이트합니다.
Richard Moore

-8

xaml에서

<TextBlock Text="{Binding CelsiusTemp}" />

에서 ViewModel값을 설정이 방법으로도 작동합니다 :

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
이것은 View-Viewmodel 분리의 전체 포인트에 위배됩니다
Askolein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.