J'essaie de formater un bloc de texte lié à une propriété TimeSpan
. Cela fonctionne si la propriété est de type DateTime
mais échoue s'il s'agit de TimeSpan
. Je peux le faire en utilisant un convertisseur. Mais j'essaie de savoir s'il existe des alternatives.
Exemple de code:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Je m'attends à ce que le bloc de texte ne montre que des heures et des minutes. Mais cela se voit comme:
19: 10: 46.8048860
Dans .NET 3.5, vous pouvez utiliser une liaison multiple à la place.
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Mettre à jour
Pour répondre aux commentaires.
Pour être sûr de produire 2 chiffres, même si heures ou minutes sont comprises entre 0 et 9, vous pouvez utiliser {0:00} au lieu de {0}. Cela garantira que la sortie pour l'heure 12:01 est 12:01 au lieu de 12: 1.
Si vous voulez afficher 01:01 en 01:01, utilisez StringFormat="{}{0}:{1:00}"
Et Mise en forme conditionnelle peut être utilisé pour supprimer le signe négatif pendant quelques minutes. Au lieu de {1:00}, nous pouvons utiliser {1: 00; 00}
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:00}:{1:00;00}">
<Binding Path="MyTime.Hours" />
<Binding Path="MyTime.Minutes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
La chaîne de format est destinée à fonctionner sur un DateTime
, pas un TimeSpan
.
Vous pouvez changer votre code pour travailler avec DateTime.Now
au lieu. Votre xaml va bien:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Mettre à jour
Et à partir de . Net 4 , formatez un TimeSpan
comme suit:
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
Juste pour ajouter au pool, j'utilise avec succès cette liaison pour afficher un TimeSpan dans une application WPF de production:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
A pris quelques tentatives pour obtenir les barres obliques inverses correctes :)
StringFormat
doit être sous la forme d'une chaîne de format. Dans ce cas, cela ressemblerait à:
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
Remarque: si vous souhaitez afficher le nombre total d’heures et de minutes et que la durée est supérieure à 24 heures, vous devez indiquer une approche: voici une solution de contournement .
Pour les liaisons multiples, vous devez faire attention depuis .NET 4.
Un bref aperçu ci-dessous, testé avec .NET 4.6:
Liaison régulière:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
Liaison multiple:
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}">
<Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBlock.Text>
ou vous pouvez utiliser " au lieu de ' dans la reliure multiple:
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
Remarque: utilisez StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" travaillera pas sur une liaison multiple, cela donnera un résultat vide.
WPF dans .NET 4 a maintenant une période de temps à partir de chaînes http://msdn.Microsoft.com/en-us/library/ee372286.aspx
J'utilise le suivant <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
Je suis conscient que cette question est ancienne maintenant, mais je suis surpris que personne n'ait suggéré ce simple StringFormat
qui fonctionnera directement sur un TimeSpan
:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
Si vous souhaitez utiliser StringFormat dans une étiquette qui utilise la propriété Content, vous pouvez utiliser ContentStringFormat pour formater votre intervalle de temps:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"