2016-08-26 2 views
10

Ich habe eine Weile mit WPF gespielt und bin auf eine interessante Sache gestoßen. Wenn ich DateTime Objekt an den Inhalt Label binde dann sehe ich lokal formatierte Darstellung des Datums. Wenn ich jedoch an die Text-Eigenschaft TextBlock binde, sehe ich tatsächlich Englisch.Kulturunterschied zwischen Label und TextBlock

Es scheint, dass TextBlock eine Art von Konverter verwendet, während Label ruft nur ToString Methode, aber ich bin mir nicht sicher darüber.

Wenn ja, warum verwendet der Label den Konverter nicht auch?

Könnte mir jemand erklären, warum funktioniert es so wie es ist? Ich stelle eine kurze Probe zur Verfügung, damit ihr sehen könnt, was vor sich geht:

// MainWindow.xaml 
<Window x:Class="BindConversion.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
    <StackPanel HorizontalAlignment="Center" Margin="3"> 
     <StackPanel> 
      <Label Content="{Binding Dt}"/> 
      <TextBlock Text="{Binding Dt}"/> 
     </StackPanel> 
    </StackPanel> 
</Window> 

// MainWindow.xaml.cs 
using System; 
using System.Windows; 

namespace BindConversion 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public DateTime Dt { get; set; } 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataContext = this; 
      Dt = DateTime.Now; 
     } 
    } 
} 

Antwort

2

Wenn Sie einen genaueren Blick auf Label nehmen, werden Sie sehen, dass es von ContentControl ableitet.

Content Eigenschaft wird durch ein ContentPresenter wo in der Dokumentation angezeigt gesagt wird die folgenden:

Wenn ein Typeconverter besteht, dass die Art der Inhalte zu einem UIElement umwandelt, die Content verwendet diesen Typeconverter und das resultierende UIElement wird angezeigt.

Jetzt gibt es eine DateTimeConverter von TypeConverter vererben, das folgende Snippet erzeugt genau die gleiche Zeichenfolge als ein Label tut:

var dateTimeConverter = new DateTimeConverter(); 
var convertToString = dateTimeConverter.ConvertToString(DateTime.Now); 

Referenzen:

https://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.componentmodel.datetimeconverter(v=vs.110).aspx

+1

... und alles an eine Eigenschaft vom Typ String zu binden, ruft nur 'ToString()' –

+0

Richtig, und die TextBox stammt nicht von ContentPresenter, also keinen Konverter verwenden. Das macht jetzt Sinn für mich. Vielen Dank. – greenshade

+0

Willkommen !!! – Aybe

1

Sie sind eigentlich ziemlich verschiedene Bestien.

dies prüfen, um weitere Informationen aus: https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

Label ist eigentlich nicht einmal eine Steuer

+1

Ja, ich weiß, dass sie sich signifikant unterscheiden und das ist sicher der Grund, warum es so ist wie es ist. Und Sie irren sich, TextBlock ist keine Kontrolle. Beachten Sie jedoch, dass TextBox ein Steuerelement ist und sich im gegebenen Szenario als TextBlock verhält. – greenshade

Verwandte Themen