L'associazione WPF con StringFormat non funziona con le descrizioni comandi


87

Il codice seguente ha una semplice associazione che associa il testo del TextBlock denominato MyTextBlock alla proprietà Text and ToolTip di TextBox utilizzando la stessa identica notazione di Binding:

<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>

L'associazione utilizza anche la proprietà StringFormat introdotta con .NET 3.5 SP1 che funziona correttamente per la proprietà Text precedente ma sembra essere interrotta per la descrizione comando. Il risultato atteso è "È: Foo Bar" ma quando si passa con il mouse sulla casella di testo, la descrizione comando mostra solo il valore di associazione, non il valore formattato della stringa. Qualche idea?


3
Non sono riuscito a far funzionare nessuna delle soluzioni suggerite di seguito, ma questa ha funzionato: stackoverflow.com/questions/4498649/…
17 del 26

Risposte:


156

Le descrizioni comandi in WPF possono contenere qualsiasi cosa, non solo testo, quindi forniscono una proprietà ContentStringFormat per le volte in cui si desidera solo testo. Avrai bisogno di usare la sintassi espansa per quanto ne so:

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

Non sono sicuro al 100% della validità dell'associazione utilizzando la sintassi ElementName da una proprietà nidificata come quella, ma la proprietà ContentStringFormat è ciò che stai cercando.


1
Capisco, pensavo che ToolTip fosse solo una semplice stringa come in Windows Forms. E sì, la sintassi ElementName in questo caso non può accedere all'elemento esterno.
huseyint

9
Tieni presente che {} è richiesto solo quando inserisci {0} all'inizio della stringa, quindi è necessario per distinguerlo dagli altri markup xaml.
Shimmy Weitzhandler

5
Mente = soffiato. Ho appena premuto questo e ho detto "waaaat?"

2
Mi ha davvero colpito dal fatto che il formato stringa non "funziona solo" quando non è specificato alcun convertitore. Ho dovuto scrivere il mio stringformatConverter. MS
lascia

3
StringFormatverrà applicato solo quando TargetTypeè il tipo di stringa. ToolTipIl contenuto è di tipo object.
Johannes Wanzek

22

Potrebbe essere un bug. Quando usi una sintassi breve per il suggerimento:

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

StringFormat viene ignorato ma quando si utilizza la sintassi espansa:

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

Funziona come previsto.


La risposta più precisa .. Grazie!
Amir Mahdi Nassiri

5

Come ha detto Matt, ToolTip può contenere qualsiasi cosa all'interno, quindi per il tuo potresti associare un TextBox.Text all'interno del tuo ToolTip.

<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>

Anche tu puoi impilare una griglia all'interno della descrizione comando e impaginare il tuo testo se lo desideri.


3

Il tuo codice può essere breve come questo:

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

Useremo il fatto che i convertitori non vengono mai ignorati, a differenza di StringFormat.

Mettilo in 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();
        }
    }
}

Mettilo nel tuo ResourceDictionary.xaml :

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

Anche se avrei preferito la risposta migliore, il problema di ElementBinding mi ha fatto inciampare. Questa risposta ha funzionato per il mio caso in cui gli altri no.
Reginald Blue

0

In questa situazione, puoi utilizzare l'associazione relativa:

<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

Quella che segue è una soluzione prolissa ma funziona.

<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>

Preferirei una sintassi molto più semplice, qualcosa come quella nella mia domanda originale.


1
@ Shimmy: "meglio" è negli occhi di chi guarda, ed è
giusto

1
@ Shimmy Ancora peggio, la sua risposta include una battuta "42".

6
@Andomar, meglio è quello che la gente decide con i suoi voti, anche in particolare qui, è quasi la stessa risposta. fare in modo che le persone rispondano alle tue domande, quindi copia le loro risposte e guadagna reputazione perché è un'attitudine completamente sbagliata.
Shimmy Weitzhandler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.