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
StringFormatTargetType문자열 유형 인 경우에만 적용됩니다 . 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.