TextBlock 스택을 사용하는 대신 문자열 연결


89

WPF ItemsControl에 고객 개체 목록을 표시하고 싶습니다. 이를 위해 DataTemplate을 만들었습니다.

    <DataTemplate DataType="{x:Type myNameSpace:Customer}">
        <StackPanel Orientation="Horizontal" Margin="10">
            <CheckBox"></CheckBox>
            <TextBlock Text="{Binding Path=Number}"></TextBlock>
            <TextBlock Text=" - "></TextBlock>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </DataTemplate>

그래서 내가 원하는 것은 기본적으로 NUMBER-NAME을 포함하는 간단한 목록 (체크 박스 포함)입니다. 바인딩 부분에서 직접 번호와 이름을 연결할 수있는 방법이 없나요?

답변:


172

사용할 수있는 StringFormat 속성 (.NET 3.5 SP1에 있음)이 있습니다. 그리고 유용한 WPF 바인딩 치트는 여기 에서 찾을 수 있습니다 . 도움이되지 않으면 항상 자신의 ValueConverter 또는 개체에 대한 사용자 지정 속성을 작성할 수 있습니다.

방금 확인하면 멀티 바인딩과 함께 StringFormat을 사용할 수 있습니다. 귀하의 경우 코드는 다음과 같습니다.

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

공백으로 형식 문자열을 시작해야했습니다. 그렇지 않으면 Visual Studio가 빌드되지 않지만 주위를 둘러 볼 수있을 것이라고 생각합니다. :)

편집
파서 {0}가 실제 바인딩으로 취급하지 못하도록 StringFormat에 공백이 필요합니다 . 다른 대안 :

<!-- use a space before the first format -->
<MultiBinding StringFormat=" {0} - {1}">

<!-- escape the formats -->
<MultiBinding StringFormat="\{0\} - \{1\}">

<!-- use {} before the first format -->
<MultiBinding StringFormat="{}{0} - {1}">

29
공백 대신 {}를 사용할 수 있습니다. 예 : StringFormat = "{} {0}-{1}"
Bryan Anderson

6
백 슬래시로 중괄호를 이스케이프 할 수도 있습니다. <MultiBinding StringFormat = "\ {0 \}-\ {1 \}">
hughdbrown

또한 닫는 TextBlock이 없으므로 주석을 요약하면 다음과 같습니다. <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} {0}-{1}"> <Binding Path = "Number"/> <Binding Path = "Name"/> </ MultiBinding> </TextBlock.Text> </ TextBlock>
TJKjaer 2010

@PiRX '이름'이 비어 있어도 '번호'를 표시하려면 어떻게해야합니까?
DasDas

@DasDas 불행히도 몇 년 동안 WPF를 사용하지 않았기 때문에 귀하의 질문에 도움을 드릴 수 없습니다. 더 이상 작업하지 않는 것을 얼마나 빨리 잊는지는 재밌습니다.
PiRX

64

동적 값을 정적 텍스트와 연결하려면 다음을 시도하십시오.

<TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"/>

디스플레이 : 234-334-5566 (SSN)


1
TextBlockLeftStyle의 내용은 무엇입니까?
itsho

텍스트 블록을 왼쪽으로 정렬해야하는 사용자 지정 스타일입니다. 여기서는 의미가 없습니다.
redskull 2013

1
이것은 바인딩을 문자열로 연결하는 최상의 솔루션입니다
Devid

9

Run 클래스를 사용하여 코드에서 사용한 다음 예제를 참조하십시오.

        <TextBlock x:Name="..." Width="..." Height="..."
            <Run Text="Area="/>
            <Run Text="{Binding ...}"/>
            <Run Text="sq.mm"/>
            <LineBreak/>
            <Run Text="Min Diameter="/>
            <Run Text="{Binding...}"/>
            <LineBreak/>
            <Run Text="Max Diameter="/>
            <Run Text="{Binding...}"/>
        </TextBlock >

3

바인딩 가능한 실행을 사용할 수도 있습니다. 특히 텍스트 서식 (색상, 글꼴 두께 등)을 추가하려는 경우 유용합니다.

<TextBlock>
   <something:BindableRun BoundText="{Binding Number}"/>
   <Run Text=" - "/>
   <something:BindableRun BoundText="{Binding Name}"/>
</TextBlock>

여기 원래 클래스 :
여기에 몇 가지 추가 개선이 있습니다.
그리고 그것은 모두 하나의 코드에 있습니다.

public class BindableRun : Run
    {
        public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged)));

        private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((Run)d).Text = (string)e.NewValue;
        }

        public String BoundText
        {
            get { return (string)GetValue(BoundTextProperty); }
            set { SetValue(BoundTextProperty, value); }
        }

        public BindableRun()
            : base()
        {
            Binding b = new Binding("DataContext");
            b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1);
            this.SetBinding(DataContextProperty, b);
        }
    }

1
<Run Text = "{바인딩 ...}"/>? 장점을 설명해 주시겠습니까?
Felix Keil

1
차이 없음; Run은이 답변이 작성되었을 때 10 년 전에 Text 속성에 대한 바인딩을 지원하지 않았습니다!
josh2112
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.