StringFormat을 사용한 WPF 바인딩이 도구 설명에서 작동하지 않습니다.


87

다음 코드에는 정확히 동일한 Binding 표기법을 사용하여 MyTextBlock이라는 TextBlock의 Text를 TextBox의 Text 및 ToolTip 속성에 바인딩하는 간단한 바인딩이 있습니다.

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox    Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}" />
</StackPanel>

바인딩은 또한 .NET 3.5 SP1에 도입 된 StringFormat 속성을 사용하는데 , 위의 Text 속성에서는 잘 작동하지만 도구 설명에서는 손상된 것 같습니다. 예상 결과는 "It is : Foo Bar"이지만 TextBox 위로 마우스를 가져 가면 도구 설명에 문자열 형식 값이 아닌 바인딩 값만 표시됩니다. 어떤 아이디어?


3
아래 제안 된 솔루션 중 어느 것도 작동하지 못했지만이 솔루션은 작동했습니다. stackoverflow.com/questions/4498649/…
— 17 of 26

답변:


156

WPF의 도구 설명은 텍스트뿐 아니라 모든 것을 포함 할 수 있으므로 텍스트를 원하는 시간에 ContentStringFormat 속성을 제공합니다. 내가 아는 한 확장 구문을 사용해야합니다.

<TextBox ...>
  <TextBox.ToolTip>
    <ToolTip 
      Content="{Binding ElementName=myTextBlock,Path=Text}"
      ContentStringFormat="{}It is: {0}"
      />
  </TextBox.ToolTip>
</TextBox>

이와 같은 중첩 속성에서 ElementName 구문을 사용하여 바인딩의 유효성에 대해 100 % 확신 할 수는 없지만 ContentStringFormat 속성이 찾고있는 것입니다.


1
나는 ToolTip이 Windows Forms에서와 같이 단순한 문자열이라고 생각했습니다. 그리고 예,이 경우 ElementName 구문은 외부 요소에 액세스 할 수 없습니다.
— huseyint

9
{}는 문자열 시작 부분에 {0}를 배치하는 경우에만 필요하므로 다른 xaml 마크 업과 구별하기 위해 필요합니다.
— Shimmy Weitzhandler

5
마음 = 날아 갔다. 방금 이걸 치고 "와아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아 아아아"

2
변환기가 지정되지 않았을 때 stringformat이 '그냥 작동'하지 않는다는 사실이 저를 정말 놀라게했습니다. 내 자신의 stringformatConverter를 작성해야했습니다. MS가 공을 다시 떨어 뜨리고 ...
— Gusdor

3
StringFormat이 TargetType문자열 유형 인 경우에만 적용됩니다 . ToolTip콘텐츠 유형 object입니다.
— Johannes Wanzek 2014 년

22

버그 일 수 있습니다. 툴팁에 짧은 구문을 사용하는 경우 :

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />

StringFormat은 무시되지만 확장 구문을 사용하는 경우 :

<TextBox Text="text">
   <TextBox.ToolTip>
      <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/>
   </TextBox.ToolTip>
</TextBox>

예상대로 작동합니다.


가장 정확한 답 .. 감사합니다!
— Amir Mahdi Nassiri

5

Matt가 말했듯이 ToolTip은 내부에 모든 것을 포함 할 수 있으므로 ToolTip 내부에 TextBox.Text를 바인딩 할 수 있습니다.

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}">
        <TextBox.ToolTip>
            <TextBlock>
                <TextBlock.Text>
                    <Binding ElementName=MyTextBlock Path="Text" StringFormat="It is: {0}" />
                </TextBlock.Text>
            </TextBlock>
        </TextBox.ToolTip>
    </TextBox>
</StackPanel>

도구 설명 안에 그리드를 쌓고 원하는 경우 텍스트를 레이아웃 할 수도 있습니다.


3

코드는 다음과 같이 짧을 수 있습니다.

<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns,
    Converter={StaticResource convStringFormat},
    ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/>

StringFormat과 달리 변환기는 무시되지 않는다는 사실을 사용합니다.

이것을 StringFormatConverter.cs에 넣으십시오 .

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace TLKiaWOL
{
    [ValueConversion (typeof(object), typeof(string))]
    public class StringFormatConverter : IValueConverter
    {
        public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (ReferenceEquals(value, DependencyProperty.UnsetValue))
                return DependencyProperty.UnsetValue;
            return string.Format(culture, (string)parameter, value);
        }

        public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

이것을 ResourceDictionary.xaml에 넣으십시오 .

<conv:StringFormatConverter x:Key="convStringFormat"/>

내가 최고 답변을 선호했지만 ElementBinding 문제로 인해 나를 넘어졌습니다. 이 대답은 다른 사람들이 그렇지 않은 내 경우에 효과적이었습니다.
— Reginald Blue

0

이 상황에서 상대 바인딩을 사용할 수 있습니다.

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding Text, RelativeSource={RelativeSource Self}}" />
</StackPanel>

-7

다음은 장황한 해결책이지만 작동합니다.

<StackPanel>
  <TextBox Text="{Binding Path=., StringFormat='The answer is: {0}'}">
    <TextBox.DataContext>
      <sys:Int32>42</sys:Int32>
    </TextBox.DataContext>
    <TextBox.ToolTip>
      <ToolTip Content="{Binding}" ContentStringFormat="{}The answer is: {0}" />
    </TextBox.ToolTip>
  </TextBox>
</StackPanel>

원래 질문에있는 것과 같은 훨씬 더 간단한 구문을 선호합니다.


1
@Shimmy : "더 나은"보는 사람의 눈에, 그것은 당신의 자신의 질문에 대답을 허용 표시 괜찮아
— Andomar

1
@Shimmy 설상가상으로 그의 대답에는 '42'농담이 포함되어 있습니다.

6
@Andomar, 더 나은 것은 사람들이 투표로 결정하는 것입니다. 또한 여기에서 특별합니다. 거의 동일한 대답입니다. ppl이 귀하의 질문에 답하고 답을 복사하고 평판을 얻는 것은 완전히 잘못된 태도입니다.
— Shimmy Weitzhandler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.