문제
WPF 경계 컨트롤에서 구속 값을 일정한 텍스트와 혼합하는 방법을 어떻게 달성 할 수 있습니까?
예를 들어, 주문을 표시하는 양식이 있고 "주문 ID 1234"와 같은 텍스트를 표시하는 레이블을 원합니다.
나는 다음과 같은 것들을 시도했습니다.
text="Order ID {Binding ....}"
이것이 달성 가능합니까, 아니면 유량 제어에 둘 이상의 레이블을 가지고있는 것과 같은 일을해야합니까?
해결책
3.5 SP1을 사용하는 경우 StringFormat
바인딩의 속성 :
<Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/>
그렇지 않으면 변환기를 사용하십시오.
<local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" />
<Label Content="{Binding Order.ID, Converter=StringFormatter}"/>
와 함께 StringFormatConverter
an IValueConverter
:
[ValueConversion(typeof(object), typeof(string))]
public class StringFormatConverter : IValueConverter
{
public string StringFormat { get; set; }
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture) {
if (string.IsNullOrEmpty(StringFormat)) return "";
return string.Format(StringFormat, value);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
그것은 트릭을 할 것입니다.
[편집하다 : 변경 Text
속성 Content
]
다른 팁
Binding.StringFormat 속성은 레이블에서 작동하지 않으므로 레이블의 ContentStringFormat 속성을 사용해야합니다.
예를 들어 다음 샘플이 작동합니다.
<Label>
<Label.Content>
<Binding Path="QuestionnaireName"/>
</Label.Content>
<Label.ContentStringFormat>
Thank you for taking the {0} questionnaire
</Label.ContentStringFormat>
</Label>
짧은 버전과 동일합니다.
<Label Content="{Binding QuestionnaireName}" ContentStringFormat="Thank you for taking the {0} questionnaire" />
이를 사용하여 값 후에 단위를 표시합니다.
<Label Content="{Binding Temperature}" ContentStringFormat="{}{0}°C" />
이 샘플은 다음과 같습니다.
<Label>
<Label.Content>
<Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/>
</Label.Content>
</Label>
예를 들어 간과되는 경우가 종종 간과됩니다.
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
또 다른 방법은 여러 실행 요소가있는 단일 텍스트 블록을 사용하는 것입니다.
<TextBlock><Run>Hello</Run><Run>World</Run></TextBlock>
..하지만 요소에 바인딩하려면 추가를 사용해야합니다. Bindablerun 수업.
업데이트 그러나이 기술에는 몇 가지 단점이 있습니다 ... 여기
또 하나의 접근법을 찾았습니다. @ultis의 솔루션은 나에게 효과가 없으며 @lpcroy 's는 나에게 우아하지 않습니다.
<Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}">
이 순간에 내가 가장 좋아하는 것은 유연하고 응축 된 것 같습니다.
Mikolaj의 답변을 수정했습니다.
<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" />
FallbackValue는 필수가 아닙니다.