문제

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는 필수가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top