2016-08-26 8 views
10

私はしばらくの間WPFで遊んでいました。面白いことが出てきました。 DateTimeオブジェクトをLabelのコンテンツにバインドすると、ローカルに書式設定された日付が表示されます。しかし、TextBlockのTextプロパティにバインドすると、実際に英語が表示されます。LabelとTextBlockの文化の違い

TextBlockは何らかのコンバータを使用していますが、LabelはちょうどToStringメソッドを呼び出しているようですが、わかりません。

もしそうなら、なぜLabelもコンバータを使用していませんか?

誰かが私に説明することができますそれはそれが動作している理由は何ですか?私はあなたに何が起こっているのかを見てもらうための短いサンプルを提供します:

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

答えて

2

ではありません。

Contentプロパティは、ドキュメントにそれが言われているContentPresenterによって表示される次のUIElementへのコンテンツの種類を変換するにTypeConverterがある場合

、のContentPresenterを使用することにTypeConverter、得られたUIElement表示されています。

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

参考文献:

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

今すぐTypeConverterから継承DateTimeConverterがあり、次のスニペットは、Labelよりも正確に同じ文字列を生成します

+1

... String型のプロパティに何かをバインドするだけで 'ToString() 'が呼び出されます。 –

+0

Right、TextBoxはContentPresenterから派生していないため、コンバーターを使用していません。それは今私には意味がある。ありがとうございました。 – greenshade

+0

歓迎!!! – Aybe

1

実際には全く異なる獣です。

チェックアウトこの詳細は: https://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/

ラベルは、実際にあなたがLabelに詳しく見ていく場合は、それがContentControlから派生していることがわかりますでも制御

+1

ええ、私はそれらが大きく異なっていることを確かに知っています、そして、確かにそれがそのままの理由かもしれません。あなたが間違っていると、TextBlockはコントロールではありません。ただし、TextBoxはコントロールであり、指定されたシナリオでTextBlockとして動作することに注意してください。 – greenshade

関連する問題