2016-08-26 13 views
10

Przez jakiś czas bawiłem się z WPF i natrafiłem na interesującą rzecz. Kiedy wiążę obiekt DateTime z treścią Label, widzę lokalnie sformatowaną reprezentację daty. Jednak po powiązaniu z właściwością tekstową TextBlock widzę ją po angielsku.Różnica kulturowa między etykietą a blokiem tekstowym

Wydaje się, że TextBlock używa jakiś konwerter natomiast Label właśnie dzwoni ToString metody, ale nie jestem pewien o tym.

Jeśli tak, dlaczego urządzenie Label nie korzysta również z konwertera?

Czy ktoś może mi wyjaśnić, dlaczego działa tak, jak jest? Dostarczam krótką próbkę, aby umożliwić wam sprawdzenie, co się dzieje:

// 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; 
     } 
    } 
} 

Odpowiedz

2

Jeśli przyjrzeć się bliżej do Label widać, że to pochodzi od ContentControl.

Content nieruchomość jest wyświetlany przez ContentPresenter gdzie w docs mówi się, co następuje:

Jeśli istnieje TypeConverter który konwertuje typ zawartości do UIElement The ContentPresenter używa tego TypeConverter i otrzymaną UIElement jest wyświetlany.

Teraz jest DateTimeConverter dziedziczenie z TypeConverter następujący fragment produkuje dokładnie ten sam ciąg niż Label robi:

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

Referencje:

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

... i powiązanie czegokolwiek z właściwością typu String po prostu wywołuje 'ToString()' –

+0

Prawo, a TextBox nie pochodzi od ContentPresenter, a zatem nie używa konwertera. Teraz ma to dla mnie sens. Dziękuję Ci. – greenshade

+0

Witam !!! – Aybe

1

To właściwie zupełnie inne bestie.

to sprawdzić więcej szczegółów: https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

Label faktycznie nie jest nawet sterowanie

+1

Tak, wiem, że są znacząco różne i to z pewnością może być powód, dlaczego jest taki, jaki jest. I jesteś w błędzie, TextBlock nie jest kontrolą. Ale zauważ, że TextBox jest formantem i zachowuje się jak TextBlock w danym scenariuszu. – greenshade