your programing

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

lovepro 2020. 10. 6. 18:54
반응형

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


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을 포함하는 간단한 목록 (체크 박스 포함)입니다. Binding 부분에서 직접 번호와 이름을 연결할 수있는 방법이 없나요?


사용할 수있는 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}">

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

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

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


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 >

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

<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);
        }
    }

참고 URL : https://stackoverflow.com/questions/541896/concatenate-strings-instead-of-using-a-stack-of-textblocks

반응형