단일 WPF TextBlock에 여러 값을 바인딩하는 방법은 무엇입니까?


210

현재 TextBlock아래 속성을 사용하여 이름이 지정된 속성 값을 바인딩하고 있습니다 Name.

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

이제 같은에 다른 속성 을 바인딩하고 싶습니다 .IDTextBlock

둘 이상의 값을 같은 것으로 바인딩 할 수 TextBlock있습니까? 간단한 연결로 수행 할 수 있습니까 Name + ID? 그렇지 않으면 어떻게 접근 할 수 있습니까?

답변:


434

속성 MultiBinding과 함께 사용할 수 있습니다 StringFormat. 사용법은 다음과 유사합니다.

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

주기 Name의 값 FooID의 값을 1, TextBlock의 당신의 출력은 될 것이다 Foo + 1.

Note: .NET 3.5 SP1 및 3.0 SP2 이상에서만 지원됩니다.


5
@Preet-이 경우 '{}'이 필요한지 실제로 확실하지 않습니다. MSDN 샘플에서 사용되었으므로 포함 시켰습니다. 그러나 일반적으로 바인딩 태그 확장과 혼동을 피하기 위해 XAML 파서의 이스케이프 시퀀스로 필요합니다.
Richard McGuire

2
이것에는 한 가지 부작용이 있습니다. 이 방법을 DataGrid정렬 동작 과 같은 방식으로 사용하면 불행히도 작동하지 않습니다. 보다 적절한 솔루션은 모델에서 바인딩 할 적절한 문자열 형식으로 읽기 전용 특성을 작성하는 것입니다. 말할 필요도없이,이 방법은 조금 장황하지만 빠르게 포맷 할 수있는 깔끔한 방법입니다.
Brett Ryan

34
형식 문자열이 매개 변수 {0}으로 시작하면 {} 만 있으면되고 형식 문자열이 텍스트로 시작하면 필요하지 않습니다. 예 : "{} {0} + {1}" "{1}의 {0} 페이지"
Dakianth

WPF 프로젝트 .Net 4.0 Visual Studio 2017에서는 작동하지 않았습니다.
Sorush

@ 패트릭의 솔루션이 나를 위해 일했습니다. 나는 이것을 작동시키지 못했습니다. 이 오류가 있었다XamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
타이슨 윌리엄스

127

나는 이것이 늦다는 것을 알고 있지만, 나는 이것을하는 또 다른 방법을 추가 할 것이라고 생각했다.

" Run s"를 사용하여 Text 속성을 설정할 수 있다는 사실을 이용할 수 있으므로 각각에 대해 Run을 사용하여 여러 바인딩을 설정할 수 있습니다. 이것은 멀티 바인딩 (Windows Phone 용으로 개발할 때 찾지 못한)에 액세스 할 수없는 경우에 유용합니다.

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

4
StringResource를 사용하여 MultiBinding을 사용할 수 없으므로 DynamicResource로 제공되는 여러 문자열에 바인딩 할 때 사용하는 매우 편리한 방법입니다.
slugster 2016 년

방금 시도했습니다. 그것은 작동하지만 (새로 고침시) 그려지는 모든 요소 (심지어 기하학)는 이제 어떤 이유로 각 틱을 깜박입니다. 다른 방법을 시도해보십시오.
Logan Klenner

6
순서가 하드 코드되어 텍스트를 현지화해야하는 경우이 작업이 어려워 질 수 있습니다.
BlueM

1
이 접근법의 또 다른 사용법은 각 바인딩마다 다른 스타일을 적용하는 것입니다
Hamid Naeemi

2019을위한 가장 좋은 대답
파 비우 BC 수자

23

이것들이 텍스트 블록 일 뿐이고 값을 연결하려는 경우 두 텍스트 블록을 바인딩하고 수평 스택 패널에 넣으십시오.

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

그러면 더 이상 코딩 할 필요없이 텍스트 (모든 Textblock 이하는 것)가 표시됩니다. 그래도 제대로 보이도록 작은 여백을 둘 수 있습니다.


11

ValueConverter 사용

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

그리고 마크 업에서

<src:MyConverter x:Key="MyConverter"/>

. . .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />

예-이것은 6 년 전에 작성되었으며 "이름"을 변환기의 첫 번째 인수 (코드의 값이라고 함)로, ID (질문의 문자열)를 두 번째 인수로 바인딩합니다.
Preet Sangha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.